sed命令详解
sed是什么
sed是linux文本处理三剑客之一,全称 StreamEDitor,非常著名的行编辑器,功能十分强大。
sed的工作过程
sed处理文本时每次从文件复制出来一行,放在工作车间,又叫做模式空间,即pattern space,然后与模式进行匹配。如果复制出来的这一行不能被模式匹配到,就默认把这一行输出至标准输出(如果用户明确指定不输出也可以)。
如果能被模式匹配到,就对这行数据进行用户指定的编辑操作,编辑完成后可能输出至标准输出,也可能是用户指定的其他操作。这样第一行就处理完成,之后处理第二行,接着第三行等等。
除了模式空间外还有一个保持空间,hold space。这是一个让人又爱又恨的东西。sed会把编辑过的行数据保存至保持空间,进行一些非常高深复杂的操作。
sed命令的用法
sed命令模板:sed [OPTION]... ‘script‘ [input-file] ...
为了给大家演示效果,我就用./fstab 给大家做演示,下面为文件的全部内容
[[email protected] ~]#cat fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420/
8f6818579f1a4118b3eeedf97bdb1df2/usr
(1)sed常用选项:
-n:不输出模式空间中的内容至屏幕;
[[email protected] ~]# sed -n ‘2p‘ fstab --------p指显示匹配到的行,“-n”表示不显示没匹配到的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
-escript, --expression=script:多点编辑,每次可给出多条命令
[[email protected] ~]# sed -e ‘3d‘ -e ‘[email protected]@@g‘ fstab 删除第三行,并去掉全文的字符串“UUID”
/etc/fstab
=2e454750-935b-4cfc-ae26-79fc6909d420 /
注意,后面“-e”的命令执行是在前面的“-e”命令执行结果上实现的,如果前者删除了某一行,后者就不会再查找那一行了
[[email protected]~]# sed -e ‘2d‘ -e ‘[email protected]@@g‘ fstab
/etc/fstab -----------------------------前条命令删除了第二行,后者就匹配不到第二行了
8f6818579f1a4118b3eeedf97bdb1df2 /usr
-f /PATH/TO/SED_SCRIPT_FILE;从一个文件中读取命令,被读取的文件中每行可以编辑一个命令;
-r,--regexp-extended:支持使用扩展正则表达式;
[[email protected] ~]# sed -r ‘[email protected]^[email protected]@g‘ fstab -----------删除文本中出现的UUID
/etc/fstab
=2e454750-935b-4cfc-ae26-79fc6909d420 /
8f6818579f1a4118b3eeedf97bdb1df2 /usr
-i[SUFFIX],--in-place[=SUFFIX]:直接编辑原文件;
[[email protected] ~]# sed -i ‘1,2d‘ fstab
[[email protected] ~]# cat fstab -------------直接在文本中删除了指定行,非常有风险,不建议这样做
8f6818579f1a4118b3eeedf97bdb1df2 /usr
(2)地址定界:
为了演示效果,我给文件增加了两行
[[email protected] ~]# cat fstab
/etc/fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
good
func
8f6818579f1a4118b3eeedf97bdb1df2 /usr
空地址:对全文进行处理;
[[email protected] ~]# sed -i ‘d‘ fstab
[[email protected] ~]# cat fstab ---------直接文本被清空了
[[email protected]~]#
单地址:#指定行;例如3就是第三行,7就是第七行。
[[email protected] ~]# sed -n ‘3p‘ fstab -------- 只显示第三行
good
/pattern/:被此模式所匹配到的每一行;
[[email protected] ~]# sed -n ‘/UU/p‘ fstab 只显示出现“UU”的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
地址范围
#,#:2,4,指第二行到第四行
[[email protected] ~]# sed ‘2,4d‘ fstab 删除2-4行
/etc/fstab
8f6818579f1a4118b3eeedf97bdb1df2 /usr
#,+#:2,+3,指从第2行到(2+3)行,即2-5行
[[email protected] ~]# sed -n ‘2,+3p‘ fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
good
func
8f6818579f1a4118b3eeedf97bdb1df2 /usr
#,/pat1/:
[[email protected] ~]# sed -n ‘2,/fun/p‘ fstab ----------从第一行到出现“fun”的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
good
func
/pat1/,/pat2/
[[email protected] ~]# sed -n ‘/U/,/fun/p‘ fstab ---------从第一次出现“U”的行,到第一次出现“fun”的行
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
good
func
$:最后一行;
[[email protected] ~]# sed -n ‘$p‘ fstab ---只显示最后一行
8f6818579f1a4118b3eeedf97bdb1df2/usr
步进:~
1~2:,从第一行开始,每次走两行,即读一行读一行,指所有奇数行
[[email protected] ~]# sed -n ‘1~2p‘ fstab
/etc/fstab
good
8f6818579f1a4118b3eeedf97bdb1df2 /usr
2~2:从第二行开始,读一行跳一行,所有偶数行
[[email protected] ~]# sed -n ‘2~2p‘ fstab
UUID=2e454750-935b-4cfc-ae26-79fc6909d420 /
func
还可以一次步进3行,4行等等
(3)编辑命令:
d:删除匹配到的行,输出屏幕的是删除匹配到的行之后的结果。
[[email protected] ~]# sed ‘2,3d‘ fstab ----------删除2-3行,就只剩下第一行
/etc/fstab
p:显示模式空间中的内容;
[[email protected] ~]# sed ‘3p‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / 8f6818579f1a4118b3eeedf97bdb1df2 /usr --------模式空间匹配到的是第三行。默认输出一次, 8f6818579f1a4118b3eeedf97bdb1df2 /usr -------------用“p又显示一次”,所以会显示两次
[[email protected] ~]# sed -n ‘3p‘ fstab -----------加 “-n”只显示匹配到的行 8f6818579f1a4118b3eeedf97bdb1df2 /usr
a \line:在行后面追加新行“line”,支持使用\n实现多行追加;
[[email protected] ~]# sed ‘2a \goodboy‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / goodboy -------------------------在第二行的下方添加一行指定内容 8f6818579f1a4118b3eeedf97bdb1df2 /usr
[[email protected] ~]# sed ‘2a \goodboy\nprettygirl‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / goodboy --------------用\n隔开多行 prettygirl 8f6818579f1a4118b3eeedf97bdb1df2 /usr
i \line:在指定行前面插入新行“line”,支持使用\n实现多行插入;
[[email protected] ~]# sed ‘3i \prettygirl‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / prettygirl 8f6818579f1a4118b3eeedf97bdb1df2 /usr
c \line:把匹配到的行替换为此处指定的文本“line”;
[[email protected] ~]# sed ‘2c \you are fucking beautiful‘fstab /etc/fstab you are fucking beautiful ----------------原来的第二行不见了,替代的是自己定义的新行 8f6818579f1a4118b3eeedf97bdb1df2 /usr
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
[[email protected] ~]# sed ‘3w ./cat.r‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / 8f6818579f1a4118b3eeedf97bdb1df2 /usr [[email protected] ~]# cat cat.r 8f6818579f1a4118b3eeedf97bdb1df2 /usr --------是原文件的第三行
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
[[email protected] ~]# sed ‘1r ./func‘ fstab /etc/fstab stupid bird -------------------这两行为func文件的内容,追加到第一行的下面 fool boy UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / 8f6818579f1a4118b3eeedf97bdb1df2 /usr
=:为模式匹配到的行显示行号,号码显示在行的下方;
[[email protected] ~]# sed ‘2,3=‘ fstab /etc/fstab 2 UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / 3 8f6818579f1a4118b3eeedf97bdb1df2 /usr
!:条件取反;地址定界!编辑命令;!写在地址定界与编辑命令中间
[[email protected] ~]#sed ‘2!d‘ fstab -----------取反后删除出第二行以外的行 UUID=2e454750-935b-4cfc-ae26-79fc6909d420 / [[email protected] ~]# sed ‘2d‘ fstab -----------删除第二行 /etc/fstab 8f6818579f1a4118b3eeedf97bdb1df2 /usr
(4)查找替换
s///:查找替换,其分隔符可自行指定,常用的有[email protected]@@, s###等;
[[email protected] ~]# sed ‘[email protected]^[email protected]&&&&@g‘fstab ---------把出现的“UUID”替换成4个连续的“UUID” /etc/fstab UUIDUUIDUUIDUUID=2e454750-935b-4cfc-ae26-79fc6909d420/ 8f6818579f1a4118b3eeedf97bdb1df2 /usr
替换标记:
g:全局替换;如上个例子所示,会查找并替换全文,否则只会替换被第一次匹配到的行
w/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
[[email protected] ~]# sed ‘[email protected]@[email protected] ./cat.r‘ fstab /etc/fstab UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 / 8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr [[email protected] ~]# cat cat.r -----------文件cat.r 中只有替换成功的行,没替换的行没写进来 UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 / 8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr
p:显示替换成功的行;
[[email protected] ~]# sed -n ‘[email protected]@[email protected]‘ fstab ------加“-n”表示只显示替换成功的行 UUID=2e454750-935b-4cfc-ae26-AAAAAAAfc6909d420 / 8f68185AAAAAAAf1a4118b3eeedf97bdb1df2 /usr
练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
[[email protected] ~]#sed ‘[email protected]^[[:space:]]\[email protected]@‘ /etc/grub2.cfg
练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
[[email protected] ~]#sed ‘[email protected]^#[[:space:]]*@@‘ /etc/fstab
练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
[[email protected] ~]# echo"/etc/passwd" | sed -r ‘[email protected][^/]+/[email protected]@‘
[[email protected] ~]#echo "/var/log/messages/" | sed ‘[email protected][^/]\+/\[email protected]@‘
据说高级编辑命令只有智商超过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:在原有的每行后方添加一个空白行;