7.4 9.4-9.5
sed常用於替換指定的字符
匹配包含root的行
[root@hyc-01-01 sed]# sed '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/NOLOGIN 此時匹配成功的行會打印兩次,匹配不成功則僅打印一次
dfjfjpwejr.odro.d
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooooooooot
adm:x:3:4:adm:/var/adm:/soooobin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
bot
boot
booot
boooot
-n 在上面命令的基礎上在sed後加-n參數,則匹配成功的行不會重復顯示,匹配不成功的不會顯示
[root@hyc-01-01 sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
onologinperator:x:11:0:operator:/root:/sbin/nologin
[root@hyc-01-01 sed]# sed -n '/10\+9/'p x.txt 匹配在1和9中間有1-n個0的情況
109
1009
10009
10109
1010109
193413410109
[root@hyc-01-01 sed]# sed -nr
109
1009
10009
10109
1010109
193413410109
匹配1次或多次+左側的字符
[root@hyc-01-01 sed]# sed -nr '/o{2}/'p test.txt 匹配oo
root:x:0:0:root:/root:/bin/bash
rooooooooooot
adm:x:3:4:adm:/var/adm:/soooobin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
boot
booot
boooot
sync:x:5:0:sync:/sbin:/bin/syncoooo
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
onologinperator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@hyc-01-01 sed]# sed -nr '/root|lpd/'p test.txt 匹配root或lpd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
onologinperator:x:11:0:operator:/root:/sbin/nologin
打印指定的行
[root@hyc-01-01 sed]# sed -n '2'p test.txt 打印第2行
bin:x:1:1:bin:/bin:/sbin/NOLOGIN
[root@hyc-01-01 sed]# sed -n '2,5'p test.txt 打印第2到5行
bin:x:1:1:bin:/bin:/sbin/NOLOGIN
dfjfjpwejr.odro.d
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooooooooot
[root@hyc-01-01 sed]# sed -n '2,$'p test.txt 打印第2行到最後一行
bin:x:1:1:bin:/bin:/sbin/NOLOGIN
dfjfjpwejr.odro.d
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooooooooot
adm:x:3:4:adm:/var/adm:/soooobin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
…
[root@hyc-01-01 sed]# sed -n '1,$'p test.txt 打印全部內容
-e 支持在一個sed命令中執行多個操作
[root@hyc-01-01 sed]# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@hyc-01-01 sed]# sed -e '/lp/'p -e '/lpd/'p -n test.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 執行多個操作時,匹配一次打印一次
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9.5 sed(下)
[root@hyc-01-01 sed]# sed -n '/test/Ip' test.txt 加大寫i參數,匹配時不區分大小寫
adm:otestx:3:4:adm:/var/adm:/soooobin/nologin
TEST
不顯示文件中指定的行,並打印剩余的行
[root@hyc-01-01 sed]# wc -l test.txt
26 test.txt
[root@hyc-01-01 sed]# sed '1,10'd test.txt 不顯示1-10行,打印剩下的行
booot
boooot
sync:x:5:0:sync:/sbin:/bin/syncoooo
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
onologinperator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
[root@hyc-01-01 sed]# wc -l test.txt
26 test.txt
此時不會直接刪除指定的行,但這些行不會出現在屏幕上,剩下的行會被打印到屏幕上
-i 在文件中徹底刪除指定的行
[root@hyc-01-01 sed]# wc -l test.txt
26 test.txt
[root@hyc-01-01 sed]# sed -i '1,10'd test.txt
[root@hyc-01-01 sed]# wc -l test.txt
16 test.txt
刪除與lpd有關的行
[root@hyc-01-01 sed]# sed -i '/lpd/'d test.txt
[root@hyc-01-01 sed]# sed -n '/lpd/'p test.txt
替換
將
[root@hyc-01-01 sed]# sed '1,10s/root/toor/g' test.txt
booot
boooot
sync:x:5:0:sync:/sbin:/bin/syncoooo
shutdown:x:6:0:shutdown:/sbitoorn:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mailtoor:/sbin/nologin
onologinperator:x:11:0:operator:/toor:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobotoordy:x:99:99:Nobody:/:/sbin/nologin
rootsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 第11行開始root不再被替換
rootdbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
將r後跟1到n個o的字符串替換為r
[root@hyc-01-01 sed]# sed -r '1,10s/ro+/r/g' test.txt
booot
boooot
sync:x:5:0:sync:/sbin:/bin/syncoooo
shutdown:x:6:0:shutdown:/sbirtn:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mailrt:/sbin/nologin
onologinperator:x:11:0:operator:/rt:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobortdy:x:99:99:Nobody:/:/sbin/nologin
rootsystemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
rootdbus:x:81:81:System message bus:/:/sbin/nologin
…
將文件中第一段內容與最後一段內容交換
[root@hyc-01-01 sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
booot
boooot
/bin/syncoooo:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbirootn:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mailroot:mail
/sbin/nologin:x:11:0:operator:/root:onologinperator
/sbin/nologin:x:12:100:games:/usr/games:games
/sbin/nologin:x:14:50:FTP User:/var/ftp:ftp
/sbin/nologin:x:99:99:Nobody:/:noborootdy
前面用小括號括起來的後面要用\+數字表示
使用脫義字符
[root@hyc-01-01 sed]# head test.txt|sed 's//sbin/nologin/123/g' 由於/有特殊含義,無法識別為一般字符,需要脫義
sed:-e 表達式 #1,字符 9:“s”的未知選項
[root@hyc-01-01 sed]# head test.txt|sed 's/\/sbin\/nologin/123/g' or
[root@hyc-01-01 sed]# head test.txt|sed 's@/sbin/nologin@123@g'
或者為了消除歧義,將命令的/替換為@
…
mail:x:8:12:mail:/var/spool/mailroot:123
onologinperator:x:11:0:operator:/root:123
games:x:12:100:games:/usr/games:123
ftp:x:14:50:FTP User:/var/ftp:123
noborootdy:x:99:99:Nobody:/:123
將文件中英文字母替換為空(刪除字母)
[root@hyc-01-01 sed]# head test.txt|sed 's/[a-zA-Z]//g'
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://
::12:100:://://
::14:50: ://://
::99:99::/://
在所有行開頭加固定字符串
[root@hyc-01-01 sed]# head test.txt|sed -r 's/(.*)/aaa:&/g' or
[root@hyc-01-01 sed]# head test.txt|sed -r 's/(.*)/aaa:\1/g'
aaa:booot
aaa:boooot
aaa:sync:x:5:0:sync:/sbin:/bin/syncoooo
aaa:shutdown:x:6:0:shutdown:/sbirootn:/sbin/shutdown
aaa:halt:x:7:0:halt:/sbin:/sbin/halt
…
(.*)可以用&代替,或者用\1表示
7.4 9.4-9.5