Bootstrap

linux sed 匹配单词,Linux正则sed的用法

*sed可以实现一些grep的功能,但是稍微麻烦了一些,sed的强项在于删除文件中的内容和替换

sed实现grep检索功能:

1.根据关键字检索:

[root@localhost ~]# sed -n '/root/'p passwd.txt

*使用sed检索时需要在关键字前加-n参数,关键字后加p,关键词还需要用 // 包括起来

2.关键字有特殊符号时加上 -r 参数或使用脱义符

[root@localhost ~]# sed -nr '/o+t/'p passwd.txt

3.打印指定行:(打印指定行时直接写行号即可,不需要加//符号括起来)

[root@localhost ~]# sed -n '5'p passwd.txt

[root@localhost ~]# sed -n '5,$'p passwd.txt #打印第五行至最后一行

4.-e 参数:使用多个表达式:

[root@localhost ~]# sed -e '1'p -e '/root/'p -n passwd.txt

*打印第一行内容并检索包含root的行,如果第一行同时包含root,那么第一行会被打印两次

5.不区分大小写:(加上大写的i)

[root@localhost ~]# sed -n '/testword/'Ip passwd.txt

sed删除功能:

1.删除打印结果中指定的行:

[root@localhost ~]# wc -l passwd.txt

22 passwd.txt

#查看文件行数

[root@localhost ~]# sed '1,20'd passwd.txt

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

linux01:x:1000:1000::/home/linux01:/bin/bash

#删除第1-20行,打印剩余的行

[root@localhost ~]# wc -l passwd.txt

22 passwd.txt

#该操作不会真实删除文件内容,只是删除打印结果

2.-i 参数:删除文件中指定的行(加上 -i参数后会真实删除文件内容)

[root@localhost ~]# wc -l passwd.txt

22 passwd.txt

[root@localhost ~]# sed -i '1,20'd passwd.txt

[root@localhost ~]# wc -l passwd.txt

2 passwd.txt

*用于在删除大日志文件内容时比较常用

sed替换功能:

1.根据关键字替换:

[root@localhost ~]# cat passwd.txt

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

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/chrony/sed_test/g' passwd.txt

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

linux01:x:1000:1000::/home/linux01:/bin/bash

*格式: ‘s/ 被替换关键字 / 替换内容 /g’

2.特殊符号匹配时加 -r 参数:

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/n+y/sed_test/g' passwd.txt

sed_test:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

3.分段替换位置:

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/g' passwd.txt

/sbin/nologin:x:998:996::/var/lib/chronwy:nnnnny

/bin/bash:x:1000:1000::/home/linux01:linux01

*使用冒号分割为3段,将第三段和第一段位置互换

4.配置关键词为目录路径时加上脱义符或使用其他替换符号:

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/\/bin\/bash/AAAAAAA/g' passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:AAAAAAA

[root@localhost ~]# sed 's#/bin/bash#AAAAAAA#g' passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:AAAAAAA

5.删除所有字母:

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed 's/[a-zA-Z]//g' passwd.txt

::998:996::///://

01::1000:1000:://01://

6.在每行前添加内容:

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -r 's/.*/sed_test:&/g' passwd.txt

sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

*匹配每行所有内容:.*,&符号代表.*的内容

7.真实替换文件中的内容:-i 参数(以上6条示例都不会实际更改文件内容,只更改替换完成的打印输出结果)

[root@localhost ~]# cat passwd.txt

nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

linux01:x:1000:1000::/home/linux01:/bin/bash

[root@localhost ~]# sed -i 's/.*/sed_test:&/g' passwd.txt

[root@localhost ~]# cat passwd.txt

sed_test:nnnnny:x:998:996::/var/lib/chronwy:/sbin/nologin

sed_test:linux01:x:1000:1000::/home/linux01:/bin/bash

补充:

把每个单词的第一个小写字母变大写:

sed ‘s/\b[a-z]/\u&/g’ filename

把所有小写变大写:

sed ‘s/[a-z]/\u&/g’ filename

大写变小写:

sed ‘s/[A-Z]/\l&/g’ filename

sed在某一行最后添加一个数字

sed -r ‘s/(^a.*)/\1 12/’ test

sed -r ‘s/^a.*/& 12/’ test

打印1到100行含某个字符串的行

sed -n ‘1,100{/abc/p}’ 1.txt

;