正则表达式2

时间:2021-10-15 20:28:11

3i就是insert插入的意思,在第3行前追加一行

[root@bogon ~]# sed '3i 222' b.txt

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

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

222

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

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

halt:x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

 

sed可以正则定位

删root开头的行

[root@bogon ~]# sed '/^root/d' b.txt

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

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

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

halt:x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

第1行删除

[root@bogon ~]# sed '1d' b.txt

第1行和第3行删除

[root@bogon ~]# sed '1d;3d' b.txt

删除1-3行

[root@bogon ~]# sed '1,3d' b.txt

 

[root@bogon ~]# touch c.txt

[root@bogon ~]# vim c.txt

[root@bogon ~]# cat c.txt

1root

2tom

3egon

4alex

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]# sed '/sb$/d' c.txt

1root

2tom

3egon

4alex

5wupeiq

6yuanhao

8sb2

[root@bogon ~]#

 

包含sb的都删除

[root@bogon ~]# sed '/sb/d' c.txt

1root

2tom

3egon

4alex

5wupeiq

6yuanhao

[root@bogon ~]# sed '/sb.*$/d' c.txt

1root

2tom

3egon

4alex

5wupeiq

6yuanhao

[root@bogon ~]#

 

2开头的行,改为111

[root@bogon ~]# sed '/^2/c 111' c.txt

1root

111

3egon

4alex

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#

 

把全部都改为111

[root@bogon ~]# sed 'c 111' c.txt

111

111

111

111

111

111

111

111

[root@bogon ~]#

 

最常用的命令是:

替换把root还ROOT(如果一行有多个,只改第一个)

[root@bogon ~]# sed 's/root/ROOT/' c.txt

1ROOTroot

2tom

3egon

4alex

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#

一行出现多个,也可以替换:

[root@bogon ~]# sed 's/root/ROOT/g' c.txt

1ROOTROOT

2tom

3egon

4alex

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#

第1个字符是数字,第2个是字母的字符串中,把sb改为SB,/s意思是修改每行的第一个,/g是同一行有多个sb就全部都改SB

[root@bogon ~]# sed '/^[0-9][a-Z]/s/sb/SB/g' c.txt

1rootroot

2tom

3egon

4alex

5wupeiq

6yuanhao

7SB

8SB2

[root@bogon ~]#

 

sed -r等于扩展,记住这个

我只想把4alexsb换成4alexSB;[root@bogon ~]# sed -r 's/要换什么/换成什么/g' c.txt

[root@bogon ~]# sed -r '/^[0-9]([a-Z]+)sb$/ s/sb/SB/g' c.txt

1rootroot

2tom

3egon

4alexSB

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#

 

我想把冒号前面的都删掉

[root@bogon ~]# cat b.txt

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

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

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

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

lp  123()17  :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

halt:x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

 

匹配字母多个,一个非字母

[root@bogon ~]# sed -r 's/^([a-Z]+)([^a-Z])//g' b.txt

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

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

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

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

 123()17  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

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

x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

 

只取第1部分:([a-Z]+)

[root@bogon ~]# sed -r 's/^([a-Z]+)([^a-Z])/\1/g' b.txt

rootx:0:0:root:/root:/bin/bash

binx:1:1:bin:/bin:/sbin/nologin

daemonx:2:2:daemon:/sbin:/sbin/nologin

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

lp 123()17  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

syncx:5:0:sync:/sbin:/bin/sync

shutdownx:6:0:shutdown:/sbin:/sbin/shutdown

haltx:7:0:halt:/sbin:/sbin/halt

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

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

只取第2部分:([^a-Z])

[root@bogon ~]# sed -r 's/^([a-Z]+)([^a-Z])/\2/g' b.txt

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

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

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

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

  123()17  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

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

:x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

最后一个单词不要

[root@bogon ~]# sed -r 's/([a-Z]+)$//g' b.txt

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

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

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

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

lp  123()17  :x:4:7:lp:/var/spool/lpd:/sbin/

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

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

halt:x:7:0:halt:/sbin:/sbin/

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

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

[root@bogon ~]#

也可以

[root@bogon ~]# sed -r 's/([^a-Z])([a-Z]+)$/\1/g' b.txt

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

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

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

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

lp  123()17  :x:4:7:lp:/var/spool/lpd:/sbin/

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

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

halt:x:7:0:halt:/sbin:/sbin/

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

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

把第1个单词和第2个单词调换

[root@bogon ~]# sed -r 's/^([a-Z]+)([^a-Z])([a-Z]+)([^a-Z])/\3\2\1\4/g' b.txt

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

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

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

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

lp  123()17  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

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

x:halt:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

 

删除每行第一个字符

[root@bogon ~]# sed -r 's/^(.)(.*)$/\2/' b.txt

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

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

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

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

p  123()17  :x:4:7:lp:/var/spool/lpd:/sbin/nologin

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

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

alt:x:7:0:halt:/sbin:/sbin/halt

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

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

[root@bogon ~]#

 

不要倒数第二个单词

[root@bogon ~]# sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\3\4/' b.txt

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

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

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

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

lp  123()17  :x:4:7:lp:/var/spool/lpd://nologin

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

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

halt:x:7:0:halt:/sbin://halt

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

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

 

sed -ri就会直接改了文件了

先弄-r,备份一下,否则-ri错了就错了

也可以

sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\3\4/' b.txt >> cc.txt

 

^[^1234b]意思是开头不是1或2或3或4或b的字符串

正则表达式2

 

Sed /i 插入

Sed /p 打印

Sed /d 删除

Sed /c 替换

Sed -o 行数

Sed -I 直接修改文件

Sed -r 扩展命令

Sed -r ‘s///g’ /etc/passwd 把一些字符换成别的字符,g是一行中只要出现某字符就改,如果只改第2行,就‘2s///g’

管道符有先执行,后执行的能力:

[root@bogon ~]# egrep -v '^#' c.txt | egrep -v '^ *$'

1rootroot

2tom

3egon

4alexsb

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#

 

只改第4行的sb为root

[root@bogon ~]# sed -r  '4s/sb/root/g'  c.txt

1rootroot

2tom

3egon

4alexroot

 

 

                      

5wupeiq

6yuanhao

7sb

8sb2

[root@bogon ~]#