sed命令详解

sed是什么

sed是linux文本理三客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大。

sed的工作

sed理文本每次从文件复制出来一行,放在工作车间,又叫做模式空,即pattern space,然后与模式行匹配。如果复制出来的一行不能被模式匹配到,就默一行出至出(如果用明确指定不出也可以)。

如果能被模式匹配到,就对这行数据行用指定的编辑操作,编辑完成后可能出至出,也可能是用指定的其他操作。这样第一行就理完成,之后理第二行,接着第三行等等。

除了模式空有一个保持空,hold space。是一个人又又恨的西。sed会把编辑过的行数据保存至保持空行一些非常高深复的操作。

sed命令的用法

sed命令模板:sed [OPTION]...  'script'  [input-file] ...

 

大家演示效果,我就用./fstab 大家做演示,下面文件的全部内容

[root@yph7 ~]#cat fstab

/etc/fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420/                      

8f6818579f1a4118b3eeedf97bdb1df2/usr

 

(1)sed常用选项

-n:不出模式空中的内容至屏幕;

[root@yph7 ~]# sed -n '2p' fstab  --------p示匹配到的行,“-n”表示不示没匹配到的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /  

-escript, --expression=script:多点编辑,每次可出多条命令

[root@yph7 ~]# sed -e '3d' -e 's@UUID@@g' fstab  除第三行,并去掉全文的字符串“UUID”

/etc/fstab

=2e454750-935b-4cfc-ae26-79fc6909d420 /         

注意,后面“-e”的命令行是在前面的“-e”命令果上实现的,如果前者除了某一行,后者就不会再找那一行了

  [root@yph7~]# sed -e  '2d' -e 's@UUID@@g' fstab

/etc/fstab          -----------------------------前条命令除了第二行,后者就匹配不到第二行了

8f6818579f1a4118b3eeedf97bdb1df2 /usr 

-f /PATH/TO/SED_SCRIPT_FILE;从一个文件中取命令,被取的文件中每行可以编辑一个命令;

 

-r,--regexp-extended:支持使用展正表达式;

[root@yph7 ~]# sed -r 's@^U+.?D@@g' fstab  -----------除文本中出的UUID

/etc/fstab

=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

8f6818579f1a4118b3eeedf97bdb1df2 /usr  

-i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件;

[root@yph7 ~]# sed -i '1,2d' fstab

[root@yph7 ~]# cat fstab   -------------直接在文本中除了指定行,非常有风险,不建议这样

8f6818579f1a4118b3eeedf97bdb1df2 /usr    

(2)地址定界

了演示效果,我文件增加了两行

[root@yph7 ~]# cat fstab

/etc/fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

good

func

8f6818579f1a4118b3eeedf97bdb1df2 /usr

空地址全文理;

[root@yph7 ~]# sed -i 'd' fstab

[root@yph7 ~]# cat fstab  ---------直接文本被清空了

[root@yph7~]#

地址:#指定行;例如3就是第三行,7就是第七行。

[root@yph7 ~]# sed -n '3p' fstab -------- 示第三行

good

/pattern/:被此模式所匹配到的每一行;

[root@yph7 ~]# sed -n '/UU/p' fstab  示出“UU”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /  

地址范

#,#:2,4,指第二行到第四行

[root@yph7 ~]# sed '2,4d' fstab   除2-4行

/etc/fstab

8f6818579f1a4118b3eeedf97bdb1df2 /usr   

 

#,+#:2,+3,指从第2行到(2+3)行,即2-5行

[root@yph7 ~]# sed -n '2,+3p' fstab  

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

good

func

8f6818579f1a4118b3eeedf97bdb1df2 /usr  

#,/pat1/:

[root@yph7 ~]# sed -n '2,/fun/p' fstab  ----------从第一行到出“fun”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

good

func

/pat1/,/pat2/

[root@yph7 ~]# sed -n '/U/,/fun/p' fstab  ---------从第一次出“U”的行,到第一次出“fun”的行

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

good

func

$:最后一行;

      [root@yph7 ~]# sed -n '$p' fstab ---示最后一行

8f6818579f1a4118b3eeedf97bdb1df2/usr   

:~

1~2:,从第一行开始,每次走两行,即一行一行,指所有奇数行

[root@yph7 ~]# sed -n '1~2p' fstab

/etc/fstab

good

8f6818579f1a4118b3eeedf97bdb1df2 /usr

2~2:从第二行开始,一行跳一行,所有偶数行

[root@yph7 ~]# sed -n '2~2p' fstab

UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                      

func

可以一次步3行,4行等等

 

(3)编辑命令

d除匹配到的行,出屏幕的是除匹配到的行之后的果。

[root@yph7 ~]# sed '2,3d' fstab ----------除2-3行,就只剩下第一行

/etc/fstab

p示模式空中的内容;

[root@yph7 ~]# sed '3p' fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr     --------模式空间匹配到的是第三行。默认输出一次,
8f6818579f1a4118b3eeedf97bdb1df2 /usr        -------------用“p又显示一次”,所以会显示两次


[root@yph7 ~]# sed -n '3p' fstab    -----------加 “-n”只显示匹配到的行
8f6818579f1a4118b3eeedf97bdb1df2 /usr


a  \line:在行后面追加新行“line”,支持使用\n实现多行追加;

[root@yph7 ~]# sed '2a \goodboy'  fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
goodboy            -------------------------在第二行的下方添加一行指定内容
8f6818579f1a4118b3eeedf97bdb1df2 /usr


[root@yph7 ~]# sed '2a \goodboy\nprettygirl' fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
goodboy      --------------用\n隔开多行
prettygirl
8f6818579f1a4118b3eeedf97bdb1df2 /usr


i \line:在指定行前面插入新行“line”,支持使用\n实现多行插入;

[root@yph7 ~]# sed '3i \prettygirl' fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
prettygirl
8f6818579f1a4118b3eeedf97bdb1df2 /usr


c  \line:把匹配到的行替换为指定的文本“line”;

[root@yph7 ~]# sed '2c \you are fucking beautiful'fstab
/etc/fstab
you are fucking beautiful   ----------------原来的第二行不见了,替代的是自己定义的新行
8f6818579f1a4118b3eeedf97bdb1df2 /usr


/PATH/TO/SOMEFILE:保存模式空匹配到的行至指定的文件中;

[root@yph7 ~]# sed '3w ./cat.r' fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr     
[root@yph7 ~]# cat cat.r
8f6818579f1a4118b3eeedf97bdb1df2 /usr    --------是原文件的第三行


r  /PATH/FROM/SOMEFILE取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;

[root@yph7 ~]# sed '1r ./func' fstab
/etc/fstab
stupid bird         -------------------这两行为func文件的内容,追加到第一行的下面
fool boy
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr


=模式匹配到的行示行号,号码显示在行的下方;

[root@yph7 ~]# sed '2,3=' fstab
/etc/fstab
2
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /                       
3
8f6818579f1a4118b3eeedf97bdb1df2 /usr


!:条件取反;地址定界!编辑命令;!写在地址定界与编辑命令中

 [root@yph7 ~]#sed '2!d' fstab  -----------取反后删除出第二行以外的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /       
[root@yph7 ~]# sed '2d' fstab -----------删除第二行
/etc/fstab
8f6818579f1a4118b3eeedf97bdb1df2 /usr


 

 

(4)找替

s///找替,其分隔符可自行指定,常用的有s@@@, s###等;

[root@yph7 ~]# sed 's@^UUID@&&&&@g'fstab   ---------把出现的“UUID”替换成4个连续的“UUID”
/etc/fstab
UUIDUUIDUUIDUUID=2e454750-935b-4cfc-ae26-79fc6909d420/                       
8f6818579f1a4118b3eeedf97bdb1df2 /usr


换标记

g:全局替;如上个例子所示,会找并替全文,否只会替被第一次匹配到的行

w/PATH/TO/SOMEFILE:将替成功的果保存至指定文件中;

[root@yph7 ~]# sed 's@79@AAAAAAA@gw ./cat.r' fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr     
[root@yph7 ~]# cat cat.r    -----------文件cat.r 中只有替换成功的行,没替换的行没写进来
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr


p示替成功的行;

[root@yph7 ~]# sed -n 's@79@AAAAAAA@gp' fstab  ------加“-n”表示只显示替换成功的行
UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 /                       
8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr


 

练习1除/boot/grub/grub2.cfg文件中所有以空白字符开的行的行首的所有空白字符;

[root@yph7 ~]#sed  's@^[[:space:]]\+@@' /etc/grub2.cfg


练习2除/etc/fstab文件中所有以#开的行的行首的#号及#后面的所有空白字符;

[root@yph7 ~]#sed  's@^#[[:space:]]*@@'  /etc/fstab


练习3出一个绝对路径sed命令,取出其目,其行类似于dirname;

[root@yph7 ~]# echo"/etc/passwd" | sed -r 's@[^/]+/?$@@'

[root@yph7 ~]#echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'

 

 







级编辑命令只有智商超240的人玩的,有兴趣的就自己看吧

级编辑命令

h:把模式空中的内容覆盖至保持空中;

H:把模式空中的内容追加至保持空中;

g:把保持空中的内容覆盖至模式空中;

G:把保持空中的内容追加至模式空中;

x:把模式空中的内容与保持空中的内容互

n:覆盖取匹配到的行的下一行至模式空中;

N:追加取匹配到的行的下一行至模式空中;

d除模式空中的行;

D除多行模式空中的所有行;

 

示例:

sed  -n 'n;p'  FILE示偶数行;

sed  '1!G;h;$!d' FILE:逆序示文件的内容;与tac命令相同

sed  ’$!d'  FILE:取出最后一行;同 “tail–n 1”

sed  '$!N;$!D' FILE:取出文件后两行;同 “tail–n 2”

sed '/^$/d;G'FILE除原有的所有空白行,而后所有的非空白行后添加一个空白行;

sed  'n;d' FILE示奇数行;

sed 'G' FILE:在原有的每行后方添加一个空白行;