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