随堂练习 文本处理三剑客 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开始的行
< 或  : 匹配词首
> 或  : 匹配词尾
: 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义

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)/321/' 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,但是有 表示换行

sed '/hello/aworld weisha' test.txt

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

sed '=' fstab

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

sed '=' fstab | sed 'N;s/ //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]+)(.+)//' 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

原文地址:https://www.cnblogs.com/xuanlv-0413/p/13193689.html