|
Sed知识补遗.doc |
|
|
Sed知识补遗
格式sed[-nefr][n1,n2]动作
-n安静模式,只有经过sed处理过的行才显示出来,其他不显示。
-e直接在命令行模式上进行sed的操作。貌似是默认选项,不用写。
-f将sed的操作写在一个文件里,用的时候-ffilename就可以按照内容进行sed操作了。
-r使之支持扩展正则表达式
n1,n2不一定需要,选择要进行处理的行,10,20表示在10~20行之间处理
动作
a添加,接字符串,添加到当前行的下一行。
c替换,接字符串,用他们替换n1到n2之间的行。
d删除符合模式的行sed''/regexp/d''??//之间是正则表达式,模式在d前面,d后面一般不接任何内容。
i插入,接字符串,添加到当前行的上一行。
p打印,打印某个选择的数据,通常与-n安静模式一起使用
s搜索,还可以替换,类似与vim里的搜索替换功能。例如1,20s/old/new/g替换1~20行的old为new,注意动作最好用''''括起来,防止空格导致错误。
例子:
显示passwd内容,将2~5行删除显示
woody@xiaoc:~/tmp$cat-n/etc/passwd|sed‘2,5d’
????1??root:x:0:0:root:/root:/bin/bash
????6??games:x:5:60:games:/usr/games:/bin/sh
????7??man:x:6:12:man:/var/cache/man:/bin/sh
????8??lp:x:7:7:lp:/var/spool/lpd:/bin/sh
............
在第二行后面一行加上HelloChina字符串
woody@xiaoc:~/tmp$cat-n/etc/passwd|sed''2aHelloChina!''
????1??root:x:0:0:root:/root:/bin/bash
????2??daemon:x:1:1:daemon:/usr/sbin:/bin/sh
HelloChina!
......
在第二行后面一行加上两行字,例如"thisisfirstline!""thisissecondline!"
woody@xiaoc:~/tmp$cat-n/etc/passwd|sed''2aThisisfirstline!\??????//使用续航符\后按回车输入后续行
>Thisissecondline!''????//以''再回车结束
????1??root:x:0:0:root:/root:/bin/bash
????2??daemon:x:1:1:daemon:/usr/sbin:/bin/sh
Thisisfirstline!
Thisissecondline!
????3??bin:x:2:2:bin:/bin:/bin/sh
将2~5行内容替换成我是大好人!
woody@xiaoc:~/tmp$cat-n/etc/passwd|sed''2,5c我是大好人!''
????1??root:x:0:0:root:/root:/bin/bash
我是大好人!
????6??games:x:5:60:games:/usr/games:/bin/sh
????7??man:x:6:12:man:/var/cache/man:/bin/sh
????8??lp:x:7:7:lp:/var/spool/lpd:/bin/sh
只显示5~7行,注意p与-n配合使用!
woody@xiaoc:~/tmp$cat-n/etc/passwd|sed-n''5,7p''
????5??sync:x:4:65534:sync:/bin:/bin/sync
????6??games:x:5:60:games:/usr/games:/bin/sh
????7??man:x:6:12:man:/var/cache/man:/bin/sh
使用ifconfig列出IP,我们只想要eth0的IP地址
可以这样,先用grep取出有IP的那一行,然后用sed去掉(替换成空)IP前面和后面的内容。
woody@xiaoc:~/tmp$ifconfigeth0
eth0????Linkencap:EthernetHWaddr00:16:36:02:41:aa
??????inetaddr:172.30.171.35Bcast:172.30.171.255Mask:255.255.255.0
??????UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1
??????RXpackets:1221198errors:0dropped:0overruns:0frame:0
??????TXpackets:1125085errors:0dropped:0overruns:0carrier:0
??????collisions:0txqueuelen:1000
??????RXbytes:1477365271(1.3GB)TXbytes:141539593(134.9MB)
??????Interrupt:20
woody@xiaoc:~/tmp$ifconfigeth0|grepinet|sed''s/^.addr://g''|sed''s/Bcast.$//g''
172.30.171.35
woody@xiaoc:~/tmp$
''^.addr:''表示从开头到addr:的字符串,将它替换为空,''Bcast.$''表示从Bcast到结尾的串,替换为空,
则剩下IP了!
在/etc/manpath.config中,将有MAN的设置取出,但不要说明内容。
woody@xiaoc:~/tmp$cat/etc/manpath.config|grep''MAN''|sed''s/#.$//g''|sed''/^$/d''
MANDATORY_MANPATH????????/usr/man
MANDATORY_MANPATH????????/usr/share/man
MANDATORY_MANPATH????????/usr/local/man
MANPATH_MAP??/bin????????/usr/share/man
MANPATH_MAP??/usr/bin??????/usr/share/man
MANPATH_MAP??/sbin????????/usr/share/man
MANPATH_MAP??/usr/sbin??????/usr/share/man
...........
注意#不一定出现在行首。因此/#.$/表示#和后面的数据直到行尾,即一行注释,将他们替换成空
/^$/表示空行,后接d表示删除空行。
注意删除空行不能用替换方法,因为空行替换成空后,还是有换行符在那一行。
楼主想的真细致,我还傻乎乎的抱怨你为什么不用grep-v''^#''或者直接就sed''/#.$/d''
注意#不一定出现在行首。因此/#.$/表示#和后面的数据直到行尾,即一行注释,将他们替换成空
/^$/表示空行,后接d表示删除空行。
注意删除空行不能用替换方法,因为空行替换成空后,还是有换行符在那一行。
|
|
|
|
|
|
|
|
|
|
|