sed学习笔记

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

sed通过对输入数据执行任意数量用户指定的编辑操作(命令)来工作sed是基于行的,因此按顺序对每一行执行命令。然后,sed将其结果写入标准输出(stdout),它不修改任何输入文件。

|6M1l7{IdD0

养成使用单引号来括起sed命令的习惯是个好注意,这样可以禁用shell扩展。sed的调用有以下两种形式:

#DAzZ WH8zcgA0

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

K!N9y-JiP&@0

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

!qJK} g+O?V0

第一种形式让你可以指定一个编辑命令,用引号引起来。第二种形式可以让你指定一个脚本文件,一个包含sed命令的文件。如果没有文件被指定,那么sed会从标准输入读取。51Testing软件测试网)m%K?;ts b$|o;X4F

-n 关闭默认输出,sed只显示那些用p命令或是s命令中有p标志的行。51Testing软件测试网].b:@` d

-e command 下一个参数是一个编辑命令。如果多个脚本或多个命令被使用的时候比较有用。51Testing软件测试网^%}b l)xZs/z

-f file 下一个参数是一个包含编辑命令的脚本文件。

:l1hNt6w6i0

如果脚本的第一行是#n,则sed会表现的像-n参数被使用过一样。

)^fl!HuQN|0

命令前面可以指定地址,地址可以是行号、符号$或正则表达式。如果指定一个地址,命令被应用到匹配的行,如果指定两个勇逗号隔开的地址,命令被两个地址之间的行。如果不指定地址,则应用到所有的行。如果地址后紧跟!,那么命令被应用到所有不匹配的行上。

gXd} `|0

如果一个命令改变了模式空间的内容,那么后续的命令会应用到模式空间的当前行中,而不是原始文件的输入行。

j*Cim6zC"w%~b:e0

删除51Testing软件测试网^DV lq d C

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

,{7~'f.GN{6z0

当用逗号将两个地址分开时,sed将把后面的命令应用到从第一个地址开始、到第二个地址结束的范围。51Testing软件测试网mv-`4Yi$a

$ sed -e '/^#/d' /etc/services | more

)E"s%p[~0h'Ds0

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

打印

$R#pKP'Uz H-r*{0

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

*n)mA c C ZZ7R)E0

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

J0t8ee%^5X0

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

R7lh1nS2qgW0

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

;bh _@)r+}z&K:k0

如果没发现"BEGIN",那么将不打印数据。如果发现了"BEGIN",但是在这之后的所有行中都没发现"END",那么将打印所有后续行。发生这种情况是因为sed面向流的特性--它不知道是否会出现"END"

sc,{6y f;a0N0

'd''p'命令,这些命令总要删除或打印整行。51Testing软件测试网$KO7d hK

替换51Testing软件测试网5tZr{&@yP.{

$ sed -e 's/foo/bar/' myfile.txt51Testing软件测试网}Ax.rp

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

7y5b bc\s[ fN0

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

mP-HM9@g*\?0

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

{JGiEe;M0

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

ZA|X9ER0

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

ofI#e nr'q0

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

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

i;N1O%?2C!S0

在该例中,使用冒号作为分隔符。如果需要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠。51Testing软件测试网v&|D#]iF^2Es

$ sed -e 's/<.*>//g' myfile.html 51Testing软件测试网&WoM;t1UWpl/Z

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

-bash-3.00$ sed -e 's/^.*/lbh said:&/' file151Testing软件测试网NIYTXw*r4M

lbh said:hello

#B,r&Bjz5r0bS@0

lbh said:I am lbh

sZG1Z G)q ]0

lbh said:this is my first file by pico

q9JZl3c!BK0

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

`]j)@W4`H0

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

x4b;p'U'B)D~'X0

hello

Ew@(Mo0

I Aam Blbh51Testing软件测试网@k]&s]

this is my first file Aby Bpico51Testing软件测试网?6qm}zx gu

-bash-3.00$51Testing软件测试网!eEr E2Xi1L#q$n

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

2T Ck/D.K0

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

Ij }(t|0

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

1ncv%u P#kQ8k9?&X0

对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后,用-f选项引用该脚本文件。

.W$A&hf9E$P ev!o0

一个地址的多个命令51Testing软件测试网IP-u)DI*J@;k

括号(())sed中被用来把一个地址嵌到另一个地址中或是用来对匹配的同样的址应用多个命令.51Testing软件测试网*p ],dS)?2WJX9X

[/pattern/[,/pattern/]]  {

3^4k/VSM!_0

command151Testing软件测试网F%W4O|Z*]'F

command251Testing软件测试网;_(KaUqA0H ?

}51Testing软件测试网*d!C~oBn{!C _

开大括号必须结束这一行,闭大括号必须自用一行。请确定在括号后面没有空格。并且每个命令自成一行

%yNTI2oH3B0

附加、插入和更改行

,H:Ao(_7Y5{-s;A@0

插入行命令用法如下:

?{]6GPy,q7X0

sed -e 'i\hi' file151Testing软件测试网/{[R_0eQ?L!T+v

hi51Testing软件测试网)z~ P.G7fp.y$x

 I am lbh51Testing软件测试网 mO7x4V,`

hi51Testing软件测试网%rS@l_xo:|?

hello51Testing软件测试网$c2`&pbv q!t

如果不为该命令指定地址,那么它将应用到每一行。51Testing软件测试网Y;uisE t R

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

(I1Hh!E!eLs1d0

[root@localhost lbh]# sed -e 'a\hi' file151Testing软件测试网NGP#_V7T

 I am lbh

'g-[ Jm%eQtgI0

hi51Testing软件测试网6VRujc"[v2I0Y

hello

:a'WK6t/Q q'RS;~5U8M0

hi51Testing软件测试网 q/] O Kms Qq+V!T@

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

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

7Z3tB^2E8t6?0

hi51Testing软件测试网x9Di0Z2fF

hi

,oo;c0tE0

 51Testing软件测试网rzRG|

zvA%C B [m$m/v] \0 51Testing软件测试网8pU0Hv6ukPe


TAG: Linux sed

 

评分:0

我来说两句

Open Toolbar