随堂练习 文本处理三剑客 sed

sed正则表达式用法

常用选项:

-n :只显示匹配行,在一般情况所有的STDIN都会输出到屏幕上,加入 -n 后只会打印被 sed 特殊处理的行

-r :扩展正则表达功能,没有该选项时正则表达式一些元字符要用反斜杠转义

-e :多个动作,一个sed 命令里可以有多个筛选条件,每个条件前需要加 -e;筛选不是选交集,是符合任一条件即输出

-i :直接修改文档读取的内容,不在屏幕上输出

command要用单引号引起来,常用命令有:

d 删除行

p 打印行

l 列出非打印字符

s 用一个字符串替换另一个

l 不区分大小写

正则表达式特殊字符

.  : 表示任何单个字符

[]  : 包含一个字符序列,表示匹配序列中其中一个字符

-  : 出现在[]中,表示一个序列范围.如[a-z]表示26个小写的英文字母

^  : 出现在[]中,表示对序列去反。如[^a-z]表示匹配不是a-z的其他字符

*  : 匹配某一个字符的0个或1个或多个实例

?  : 匹配某一个字符的0个或1个实例

+  : 匹配某一个字符的1个或多个实例

$  : 匹配行尾。如test$指匹配以test结尾的行

^  : 匹配行首。如^test指匹配以test开始的行

\< 或 \b : 匹配词首

\> 或 \b : 匹配词尾

\ : 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义

sed总结

sed命令

a\\  在当前行下面插入文本。

i\\  在当前行上面插入文本。

c\\  把选定的行改为新的文本。

d  删除,删除选择的行。

D  删除模板块的第一行。

s  替换指定字符

h  拷贝模板块的内容到内存中的缓冲区。

H  追加模板块的内容到内存中的缓冲区。

g  获得内存缓冲区的内容,并替代当前模板块中的文本。

G  获得内存缓冲区的内容,并追加到当前模板块文本的后面。

l  列表不能打印字符的清单。

n  读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

N  追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

p  打印模板块的行。

P (大写) 打印模板块的第一行。

q  退出Sed。

b  lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

r file 从file中读行。

t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

T label  错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

w file  写并追加模板块到file末尾。

W file  写并追加模板块的第一行到file末尾。

!  表示后面的命令对所有没有被选定的行发生作用。

=  打印当前行号码。

#  把注释扩展到下一个换行符以前。

sed替换标记

g  表示行内全面替换。

p  表示打印行。

w  表示把行写入一个文件。

x  表示互换模板块中的文本和缓冲区中的文本。

y  表示把一个字符翻译为另外的字符(但是不用于正则表达式)

\\1  子串匹配标记

&  已匹配字符串标记

sed元字符集

^  匹配行开始,如:/^sed/匹配所有以sed开头的行。

$  匹配行结束,如:/sed$/匹配所有以sed结尾的行。

.  匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

*  匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

[]  匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。

[^]  匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

\\(..\\)  匹配子串,保存匹配的字符,如s/\\(love\\)able/\\1rs,loveable被替换成lovers。

&  保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

\\<  匹配单词的开始,如:/\\\\> 匹配单词的结束,如/love\\>/匹配包含以love结尾的单词的行。

x\\{m\\}  重复字符x,m次,如:/0\\{5\\}/匹配包含5个0的行。

x\\{m,\\}  重复字符x,至少m次,如:/0\\{5,\\}/匹配至少有5个0的行。

x\\{m,n\\}  重复字符x,至少m次,不多于n次,如:/0\\{5,10\\}/匹配5~10个0的行。

范例:

1,打印第五行

sed -n '5p' test.txt

2,打印第一行到第五行

sed -n '1,5p' test.txt

3,打印第一行到最后一行

sed -n '1,$p' test.txt

4,打印包含root字符串的行

sed -n '/root/p' test.txt

5,打印以 g 开头的行

sed -n '/^g/p' test.txt

6,打印以 in 结尾的行

sed -n '/in$/p' test.txt

7,打印包含“r..t”字符串的行,两个点表示两个任一字符

sed -n '/r..t/p' test.txt

8,打印包含一个以上o的行,星号表示大于等于零个前字符

sed -n 'oo*p' test.txt

9,打印第一行和包含long的行

sed -n -e '1p' -e '/long/p' test.txt

10,删除第一行

sed '1d' test.txt

11,删除第一行到三行

sed '1,3d' test.txt

12,删除包含oot字符的行

sed '/oot/d' test.txt

13,第一到第二行的ot替换为to,与vim 中替换命令类似

sed '1,2s/ot/to/g' test.txt

14,与上一条命令类似,可以将斜杠换成@号,也可以换成#

sed 's@ot@to@g' test.txt

15,删除数字

sed 's/[0-9]//g' test.txt

16,删除字母

sed 's/[a-zA-Z]//g' test.txt

17,圆括号为一个整体,替换三个括号内容的顺序,123代表三个括号

sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt

18,在行前面加上123。也可以像上面用\1来表示前面的整体,不过要用圆括号扩起来

sed 's/^.*$/123&/' test.txt

19,ot替换为to,并修改文本。没有-i的话以上所有操作只是标准输出的屏幕,不会修改文本

sed -i 's/ot/to/g' test.txt

20,删除 test.txt 中所有特殊字符(除了数字以及大小写字母)

sed 's/[^0-9a-zA-Z]//g' test.txt

21,在 test.txt 30行到末行最前面加‘aaa’

sed 's/^.*$/&aaa/' test.txt

22,表示以 # 号开头的行不显示

sed -n '/^#/!p' fstab

23,表示第2行,第6行删除

sed -e '2d;6d' test.txt

24,表示第2到第6行都删除

sed -e '2,6d' test.txt

25,表示把word加在含有hello后一行  默认是在后面一行追加

sed '/hello/aword' test.txt

26,表示把含有hello的行替换为hello world  ,这里g是全文替换,注意前面有s

sed 's/hello/hello world/g' test.txt

27,表示在含有hello后面一行追加world westos,其中world westos在一行

sed '/hello/aworld weisha' test.txt

28,表示在含有hello 后面一行追加 world westos,但是有\n表示换行

sed '/hello/aworld\nweisha' test.txt

29,在所有行的前面一行添加行号

sed '=' fstab

30,给每一行行首添加行号

sed '=' fstab | sed 'N;s/\n//g'

31,从包含adm到包行sync的行里面,全文替换nologin为weisha

sed -e '/adm/,/sync/s@nologin@weisha@g' passwd

32,从包含adm到包行sync的行里面,全文替换nologin为wei,全文替换sbin为leo ;表示衔接多个操作

sed -e '/adm/,/sync/s/nologin/wei/g;s/sbin/leo/g' passwd

33,删除文件每行的第一个字符

sed -r 's/^.//g' passwd

34,删除每行开头的所有空格

sed -r 's/^ //g' passwd

35,只显示每行的一个单词

sed -r 's/([0-9a-Z]+)(.*)/\1/g'  passwd

36,找出 /etc/rc.d/init.d/functions 文件中所有的函数名称,名称包含 _ 和 ()

sed -nr 's@(.*\(\)) \{@\1@p' /etc/rc.d/init.d/functions

37,替换一个文件/etc/passwd里的这root❌0:0:root:/root:/bin/bash一行第二个root为test?

sed -ri '/^root/s/root/test/2' /etc/passwd

38,sed将文件test中第50行中的haiwao改为haiwai?

sed -ri '50s/haiwao/haiwai/' test

 

取文件前缀
[20:16:14 root@sz-kx-centos8 ~]# echo mariadb-10.2.33.tar.gz | sed -rn 's#(.*)\.([^.]+)(\.[^.]+)#\1#p'
mariadb-10.2.33
 
[20:16:23 root@sz-kx-centos8 ~]# echo mariadb-10.2.33.tar.gz | sed -rn 's#(.*)\.([^.]+)(\.[^.]+)#\2#p'
tar
 
取文件后缀
[20:16:27 root@sz-kx-centos8 ~]# echo mariadb-10.2.33.tar.gz | sed -rn 's#(.*)\.([^.]+)(\.[^.]+)#\2\3#p'
tar.gz
 
取目录名
[20:16:32 root@sz-kx-centos8 ~]# echo /etc/sysconfig/network-scripts/ifcfg-ens160.bak | sed -rn 's#(^/.*/).*#\1#p'
/etc/sysconfig/network-scripts/
 
取文件基名
[20:16:44 root@sz-kx-centos8 ~]# echo /etc/sysconfig/network-scripts/ifcfg-ens160.bak | sed -rn 's#(^/.*/)([^/]+)#\2#p'
ifcfg-ens160.bak
 
将文件非 # 开头的行加上 #
[20:18:53 root@sz-kx-centos8 ~]# sed -rn "s@^[^#]@#&@p" /etc/fstab
#UUID=1b067e41-0beb-4b7e-8e26-a50682f8ec15 / xfs defaults 0 0
#UUID=4d4cd2dd-1a43-44cd-bf9e-3298f6dc34f4 /boot ext4 defaults 1 2
#UUID=8a97abcb-dec2-4a98-b223-e5fc96b744d6 /data xfs defaults 0 0
#UUID=1dc1bd88-38ad-41ff-91cc-8edd2ba6243b swap swap defaults 0 0
 
将文件非 # 开头的行加上 #
[20:20:48 root@sz-kx-centos8 ~]# sed -rn 's@^[^#](.*)@#\1@p' /etc/fstab
#UID=1b067e41-0beb-4b7e-8e26-a50682f8ec15 / xfs defaults 0 0
#UID=4d4cd2dd-1a43-44cd-bf9e-3298f6dc34f4 /boot ext4 defaults 1 2
#UID=8a97abcb-dec2-4a98-b223-e5fc96b744d6 /data xfs defaults 0 0
#UID=1dc1bd88-38ad-41ff-91cc-8edd2ba6243b swap swap defaults 0 0
 
过滤显示除开空行和 # 开头行
[08:29:19 root@sz-centos7 /home]# sed -r '/^(#|$)/d' /etc/httpd/conf/httpd.conf | sed -n '/^$/d;/^[[:space:]]*#/!p'
 
过滤显示除开空行和 # 开头行
[08:32:48 root@sz-centos7 /home]# sed -n -e '/^$/d' -e '/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf

posted @ 2020-06-26 02:13  空白的旋律  阅读(162)  评论(0编辑  收藏  举报