7.4 9.4-9.5

9.4 sed(上)

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 匹配在19中间有1-n0的情况

109

1009

10009

10109

1010109

193413410109

[root@hyc-01-01 sed]# sed -nr '/10+9/'p x.txt –r参数可以使+等特殊符号不需要专门脱义字符脱义

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 匹配rootlpd

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 打印第25

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后跟1no的字符串替换为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表示


猜你喜欢

转载自blog.51cto.com/12216458/2136361
7.4