1. 程式人生 > >?9.4 9.5 sed

?9.4 9.5 sed

sed

六周第二次課

9.4 9.5 sed



9.4 sed(上)

技術分享圖片

其實grep工具的功能還不夠強大,它實現的只是查找功能,而不能把查找的內容替換。以前用vim操作文檔的時候,可以查找也可以替換,但只限於在文本內部操作,而不能輸出到屏幕上。

sed工具就能把替換的文本輸出到屏幕上,而且還有其他更豐富的功能。sed和awk都是流式編輯器,是針對文檔的行來操作的。


準備工作,把~/grep/passwd 復制到 ~/sed/tset.txt

1444 2018/03/13 13:43:20 mkdir sed

1445 2018/03/13 13:43:23 cd sed/

1446 2018/03/13 13:43:24 ls

1447 2018/03/13 13:44:18 cp ../grep/passwd test.txt

1448 2018/03/13 13:44:19 ls


#sed -n 'n'p filename

'n'是一個數字,表示第幾行。

-n作用是只顯示我們要打印的行,無關緊要的內容不顯示。

p=print 打印


打印第二行的數據(-n是把除了第二行之外的數據都不被打印出來):

[root@centos7 sed]# sed -n '2'p test.txt

bin:x:1:1:bin:/bin:/sbin/nologin


指定範圍用法,例如 第二到第五行

[root@centos7 sed]# sed -n '2,5'p test.txt

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

123:rao

456:r>o

第五到最後一行 25,$

[root@centos7 sed]# sed -n '25,$'p test.txt

chrony:x:998:996::/var/lib/chrony:/sbin/nologin


aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

user5:x:1002:1002::/home/user5:/bin/bash


打印全部行

[root@centos7 sed]# sed -n '1,$'p test.txt


打印某個字符串的行,例如打印含有root的行

[root@centos7 sed]# sed -n '/root/'p test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin


同樣也支持特殊符號用法,如^ $ . + *等等

但是有些特殊符號需要脫義,例如+需要用\脫義。在sed裏,可以用-r脫義。

[root@centos7 sed]# sed -n '/o\+t/'p test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

123:rooot

[root@centos7 sed]# sed -nr '/o+t/'p test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

123:rooot


匹配2次o的行

[root@centos7 sed]# sed -nr '/o{2}/'p test.txt

root:x:0:0:root:/root:/bin/bash

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

321:hooome

123:rooot

456:hooooooo

postfix:x:89:89::/var/spool/postfix:/sbin/nologin


-e用法 實現多個動作(支持數據重疊)

例如,在同一條命令上 指定行打印 匹配字符串打印。

打印第二行,且匹配'bus'的字符串 示例如何:

[root@centos7 sed]# sed -e '2'p -e '/bus/'p -n test.txt

bin:x:1:1:bin:/bin:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin



9.5 sed(下)


-I 不區分大小寫

[root@centos7 sed]# sed '/bus/'Ip -n test.txt

132:r1o:BUs

dbus:x:81:81:System message bus:/:/sbin/nologin


-d 刪除指定的行

這裏的刪除指的是刪除顯示,而不是真正修改文件的內容。

[root@centos7 sed]# wc -l test.txt

29 test.txt

[root@centos7 sed]# sed '1,25'd test.txt


aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

user5:x:1002:1002::/home/user5:/bin/bash


先備份test.txt,復制備份為test.txt.bak

[root@centos7 sed]# cp test.txt test.txt.bak

[root@centos7 sed]# ls

test.txt test.txt.bak


-i 直接修改文件的內容

能把文件內容刪掉,也就是說能完全修改文件內容。

[root@centos7 sed]# wc -l test.txt

29 test.txt

[root@centos7 sed]# sed -i '1,25'd test.txt

[root@centos7 sed]# wc -l test.txt

4 test.txt


刪除指定含有字符串的行

刪除含有user5的行

[root@centos7 sed]# cat test.txt


aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

user5:x:1002:1002::/home/user5:/bin/bash

[root@centos7 sed]# sed -i '/user5/'d test.txt

[root@centos7 sed]# cat test.txt


aming:x:1000:1000::/home/aming:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash


把備份復制回來

sed的替換功能

其實sed的替換功能跟vim的替換功能用法差不多,格式也是'1,10s/root/toor/g',其中s是替換,g是全局替換。

[root@centos7 sed]# sed '1,10s/root/toor/g' test.txt |head

toor:x:0:0:toor:/toor:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

123:rao

456:r>o

132:r1o:BUs

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


因為有+,所以在sed上面要-r脫義。

其中這裏的ro+等於roo,因為在正則表達式裏面,此條件是成立的。

[root@centos7 sed]# sed -r '1,10s/ro+/r/g' test.txt

[root@centos7 sed]# sed -r '1,10s/ro+/r/g' test.txt |head

rt:x:0:0:rt:/rt:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

123:rao

456:r>o

132:r1o:BUs

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


sed支持管道| 調換位置

把root和bin/bash調換位置,

:是分隔符

[root@centos7 sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'

's/ 不指定換位,默認從第一行開始。

([^:]) 非:的字符

(.*): .*代表貪婪匹配,(.*):貪婪匹配:

\3:\2:\1 代表每個: 反序的意思代指最後跟最前調換位置.

前面()()() 後面\\\表示


[root@centos7 sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:daemon:/sbin:daemon

123:rao

456:r>o

BUs:r1o:132

/sbin/nologin:x:3:4:adm:/var/adm:adm

/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

/bin/sync:x:5:0:sync:/sbin:sync

/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown


把所有英文字母的信息刪除掉

[root@centos7 sed]# head test.txt |sed 's/[a-zA-Z]//g'

::0:0::/://

::1:1::/://

::2:2::/://

123:

456:>

132:1:

::3:4:://://

::4:7::///://

::5:0::/://

::6:0::/://

如果替換的時候/後為空,表示空白,就是刪除的意思。


在所有行前面加入aaa

&表示後面的數據

[root@centos7 sed]# head test.txt |sed -r 's/(.*)/aaa:&/'

aaa:root:x:0:0:root:/root:/bin/bash

aaa:bin:x:1:1:bin:/bin:/sbin/nologin

aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin

aaa:123:rao

aaa:456:r>o

aaa:132:r1o:BUs

aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin

aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

aaa:sync:x:5:0:sync:/sbin:/bin/sync

aaa:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


?9.4 9.5 sed