配色: 字号:
Sed知识补遗.doc
2020-04-28 | 阅:  转:  |  分享 
  
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表示删除空行。

注意删除空行不能用替换方法,因为空行替换成空后,还是有换行符在那一行。

献花(0)
+1
(本文系AiChemi首藏)