sed学习笔记

上一篇 / 下一篇  2008-06-10 11:37:20 / 个人分类:Linux

sed通过对输入数据执行任意数量用户指定的编辑操作(命令)来工作sed是基于行的,因此按顺序对每一行执行命令。然后,sed将其结果写入标准输出(stdout),它不修改任何输入文件。51Testing软件测试网OD+rw E:N-W"P;G

养成使用单引号来括起sed命令的习惯是个好注意,这样可以禁用shell扩展。sed的调用有以下两种形式:51Testing软件测试网Oyfk\ l"Y l

sed [-n][-e] ' [address[,address]][!]command' file(s)

eXx2zj%X,W0

sed [-n] -f scrīptfile file(s)

D#B'vG}0

第一种形式让你可以指定一个编辑命令,用引号引起来。第二种形式可以让你指定一个脚本文件,一个包含sed命令的文件。如果没有文件被指定,那么sed会从标准输入读取。51Testing软件测试网9L&P@ ?O#_

-n 关闭默认输出,sed只显示那些用p命令或是s命令中有p标志的行。

9\/Yh4h.H_ dD0

-e command 下一个参数是一个编辑命令。如果多个脚本或多个命令被使用的时候比较有用。51Testing软件测试网'sQ$H#P!l(M"r

-f file 下一个参数是一个包含编辑命令的脚本文件。51Testing软件测试网3o'|"X}L0D `

如果脚本的第一行是#n,则sed会表现的像-n参数被使用过一样。51Testing软件测试网$U TiS%D

命令前面可以指定地址,地址可以是行号、符号$或正则表达式。如果指定一个地址,命令被应用到匹配的行,如果指定两个勇逗号隔开的地址,命令被两个地址之间的行。如果不指定地址,则应用到所有的行。如果地址后紧跟!,那么命令被应用到所有不匹配的行上。51Testing软件测试网"ek r*D^K"C

如果一个命令改变了模式空间的内容,那么后续的命令会应用到模式空间的当前行中,而不是原始文件的输入行。51Testing软件测试网eY+B V?,v

删除51Testing软件测试网0s\j@)w'}i

$ sed -e '1,10d' /etc/services | more

C{X0}"m"{9j L^0

当用逗号将两个地址分开时,sed将把后面的命令应用到从第一个地址开始、到第二个地址结束的范围。

Z,i(@ kL0

$ sed -e '/^#/d' /etc/services | more51Testing软件测试网 l0R%q,w;Xn7mz z

'/^#/'部分,它是一种新的 规则表达式地址。规则表达式地址总是由斜杠括起。它们指定一种 模式,紧跟在规则表达式地址之后的命令将仅适用于正好与该特定模式匹配的行。51Testing软件测试网w8b-_A j8s|bN4N

打印

C D Gq6q.d0

$ sed -n -e '/regexp/p' /path/to/my/test/file | more

9cT4Nl*utV`~M-p)P0

请注意新的'-n'选项,该选项告诉sed除非明确要求打印模式空间,否则不这样做。您还会注意到,我们用'p'命令替换了'd'命令,如您所猜想的那样,这明确要求sed打印模式空间。就这样,将只打印匹配部分。51Testing软件测试网OG{ ^Z rEWV4A

可以指定两个用逗号分开的规则表达式,sed将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。

+ZP e9c u-M-wa0

$ sed -n -e '/BEGIN/,/END/p' /my/test/file | more

x&_uteV;H;D0

如果没发现"BEGIN",那么将不打印数据。如果发现了"BEGIN",但是在这之后的所有行中都没发现"END",那么将打印所有后续行。发生这种情况是因为sed面向流的特性--它不知道是否会出现"END"51Testing软件测试网rst"j0gz{!V/V_

'd''p'命令,这些命令总要删除或打印整行。

%H&]&|pu5\ rXS0

替换

&M"^"uR UD]kQ8~0

$ sed -e 's/foo/bar/' myfile.txt

hZ9L(D6XD0

上面的命令将myfile.txt中每行第一次出现的'foo'(如果有的话)用字符串'bar'替换,然后将该文件内容输出到标准输出。51Testing软件测试网JPXi-Z)r_

$ sed -e 's/foo/bar/g' myfile.txt

0roY NN0

在最后一个斜杠之后附加的'g'选项告诉sed执行全局替换。

%QQl7je2p.H$I1?0

's///'还可以与地址一起使用来控制要将命令应用到哪些行,如下所示:

'h!\k1^+^*C#}0

$ sed -e '1,10s/enchantment/entrapment/g' myfile2.txt

:jp!q!s/X+V,t0

关于's///'命令的另一个妙处是'/'分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在's'之后指定一个不同的字符来更改分隔符。例如,下例将把所有出现的/usr/local替换成/usr51Testing软件测试网 T+G P T(g V5y

$ sed -e 's:/usr/local:/usr:g' mylist.txt

G!u%d _'i Cy(h {0

在该例中,使用冒号作为分隔符。如果需要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠。

+CT:Q^{1m0

$ sed -e 's/<.*>//g' myfile.html 

y/PV8`+d0st0

这是要从文件除去HTML标记的第一个很好的sed脚本尝试,但是由于规则表达式的特有规则,它不会很好地工作。原因何在?当sed试图在行中匹配规则表达式时,它要在行中查找 最长的匹配。51Testing软件测试网9w7v3Dg6M ]0b6i,nt

-bash-3.00$ sed -e 's/^.*/lbh said:&/' file1

&Z i/C| R0

lbh said:hello

k-C/mOQQ0

lbh said:I am lbh

$GqT#Sa0z$s(e0

lbh said:this is my first file by pico51Testing软件测试网0A'o@{Y y3A gM

该例的替换字符串中使用了'&'字符,在输出结果中该字符被整个匹配的规则表达式所代替。

Zv6PE A~R0

-bash-3.00$ sed -e 's/\(.* \)\(.* \)\(.*\)/\1A\2B\3/' file1

4^,ez6NZUL)i,E0

hello

W#G J%X:F.o7`D'^ O0nf,V0

I Aam Blbh

B`\}:E*yx"U"d0

this is my first file Aby Bpico51Testing软件测试网l%{7] ^uFhk

-bash-3.00$51Testing软件测试网4P}w [{ k p-B

上面的例子中,将在其中每个感兴趣的区域两边插入带反斜杠的圆括号来定义区域,通过输入'\x'(其中,x是从1开始的区域号)来引用每个由圆括号定界的区域。

TW+g E9e0

在开始创建更复杂的sed脚本时,需要有输入多个命令的能力。有几种方法这样做。首先,可以在命令之间使用分号。无论什么时候指定了两个或更多命令,都按顺序将每个命令应用到文件的每一行。虽然分号很方便,但是在某些场合下,它不能正常工作。另一种替换方法是使用两个-e选项来指定两个不同的命令:51Testing软件测试网x3q7tG4K/`-Q5p"o

$ sed -n -e '=' -e 'p' myfile.txt

~/Q}kR0

对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后,用-f选项引用该脚本文件。51Testing软件测试网6Gy"c~j4E'g+V

一个地址的多个命令

Zchm3p&bv0

括号(())sed中被用来把一个地址嵌到另一个地址中或是用来对匹配的同样的址应用多个命令.51Testing软件测试网:JCz.I\"{ L

[/pattern/[,/pattern/]]  {51Testing软件测试网? X x)@1_6Yy(z:y

command151Testing软件测试网[@;Ju#W8@5D^#X

command2

.K1F w~%Y0uo ~n0

}51Testing软件测试网9G#@]V%ark)U0g

开大括号必须结束这一行,闭大括号必须自用一行。请确定在括号后面没有空格。并且每个命令自成一行51Testing软件测试网Wri kJ;L\!g0_1W

附加、插入和更改行51Testing软件测试网d~`6M ](d-I

插入行命令用法如下:51Testing软件测试网dl{U t)Km3c

sed -e 'i\hi' file1

h[$v%HN!Xwv0

hi

7?j yY9o8Bzg3t|9W0

 I am lbh51Testing软件测试网6he0Hu k]L:k

hi

~!O:THA%P0

hello51Testing软件测试网 Q!M6_9Y c#i T1W:_

如果不为该命令指定地址,那么它将应用到每一行。51Testing软件测试网kN;G$o$F Vc{6Zmpx

附加命令的用法与之类似,但是它将把一行或多行插入到模式空间中的当前行之后。其用法如下:

/a |W"x#UB qCg{0

[root@localhost lbh]# sed -e 'a\hi' file1

.YJ._z'WD0

 I am lbh

W\?2y CwR\ W0

hi

:H D(k8^w1W;agc0

hello

*x1RFY {sgo5u1T"}0

hi

/WCbi'CH2K3C3l+y*~[0

另一方面,更改行命令将实际 替换模式空间中的当前行,其用法如下:51Testing软件测试网"V0aux?w

[root@localhost lbh]# sed -e 'c\hi' file1

$txE B$^6A0

hi

[*yfo4Su9Z"[0

hi51Testing软件测试网7ycO+zl@

 

0|IU)f RX J051Testing软件测试网h2p~&F;k-V7O

 51Testing软件测试网3|8gK1I\t


TAG: Linux sed

 

评分:0

我来说两句

Open Toolbar