特殊字符
基础
^word
:行首word$
:行尾.
:一个任意字符\
:转义*
:冲重复前一个字符零到无穷个[list]
:代表列表内字符串中的任意一个字符[n1-n2]
:代表n1-n2字符范围内的一个字符[^list]
:代表非该字符串的其他字符串[^n1-n2]
:代表n1-n2字符范围外的一个字符\{n,m\}
:重复前一个字符n~m个(对于 sed 需要用 \ 因为 sed 中 {} 是特殊字符,对于 grep ,可以直接使用 {},它不是特殊字符)
\s 同 [[:space:]]
: 空白符,回车、空格、制表等
\S 同 [^[:space:]]
: 非空白符
\d 同 [[:digit:]] 同 [0-9]
: 数字
\D 同 [^[:digit:]] 同 [^0-9]
: 非数字
\w 同 [[:alnum:]] 同 [0-9a-zA-Z]
: 词字符
\W 同 [^[:alnum:]] 同 [^0-9a-zA-Z]
: 非词字符
在文本编辑器的搜索中尽量使用 \s 这种写法,因为比较快
在 sed 工具中尽量使用 [a-z] 这种写法,因为sed使用斜杠转移需要用到单引号,过多的单引号会影响代码阅读
扩展
+
:前面的一个字符有一个或一个以上?
:前面的一个字符有0个或1个以上|
:放在两个字符串中间,代表两个字符串中的一个()
:组群()+
:括号内是有一个字符串,该字符串有一个或一个以上
命令
正则表达式需要被带引号包围起来
grep
-E
:开启扩展正则表达式的支持,等于egrep命令-v
:反向-i
:忽略大小写-n
:输出行号-c
:只显示匹配行的数量,不显示文本内容-x
:只显示整行严格匹配的行-r
:递归查找该目录下的所有文件--color
:高亮-o
:只显示匹配到的字符串,而不是显示有匹配到的字符串的行-P
:使用 Perl 语言的正则表达式语法,我一般用它来使用非贪婪的正则表达式,因为 grep 只能使用贪婪
sed
'\'
:使反斜杠具有转义字符的效果
'''$var'''
:三对单引号可以使用变量
命令选项
-r
:开启扩展正则表达式支持-n
:静默模式,即不打印输出-i
:直接在文本上处理-e
:要使用多个命令时会用到,处理完第一个命令后,接着往下读文件,再处理第二个命令,模式空间会被第二个命令更新{命令1;命令2;}
:不更新模式空间的情况下进行多个命令
功能参数
- 一般两个功能参数不能同时使用,除非有特定的组合;
- sed会打印处理完成后的完整文本,不用加p(仅仅是查找的话,因为查找不会改表文本的内容,所以依旧打印整个文本。如果只想看查找的那几行就用-n和p的组合)
a,向后追加
i,向前插入
c,替换整行,或连续几行
d,删除
p,打印
s,替换。s表示所有行,2s表示第二行。可以只有s,没有g;不能只有g,没有s
g,替换功能参数【s】的辅助功能参数,表示一行中的第几个,g表示整行,2表示第二个【注意,不是2g,是2】。常与s连用,替换整个文本中的指定的字符或字符串
q,退出sed
r,读入一个文本
w,写入一个文本
!,非
=,打印当前行号
y,把一个字符换成领一个字符
模式空间
sed是从头到尾对文本一行一行地处理,正在处理的行是从文本读入后放在模式空间中的
Sed————多行处理————
n,读入下一行到模式空间
N,追加下一行到模式空间,用多个N可追加多行
D,与N连用,删除模式空间的第一行,即从头删到第一个\n
P,与N连用,只打印模式空间的第一行
保留空间:sed提供的一块可以与模式空间交换文本的空间,原本为空
Sed————保留空间命令————
h,将模式空间复制到保留空间
H,将模式空间追加到保留空间
g,将保留空间复制到模式空间,如保留空间为空,则复制空行
G,将保留空间追加到模式空间,如保留空间为空,则追加空行
x,将保留空间的内容与模式空间的内容互换
——————————Sed示例——————————
sed -n '/xxx/,/yyy/p' file
打印有xxx字符串的行到有yyy字符串的行
sed 's/xxx/yyy/2' file
把每一行的第二个xxx换成yyy
sed '2s/xxx/yyy/g' file
把第二行所有的xxx换成yyy
sed '/xxx/s/yyy/zzz/' file
把有xxx行的yyy换成zzz
sed '2{s/xxx/yyy/g;s/aaa/bbb/g;}' file
把第二行的所有xxx换成yyy,所有aaa换成bbb
sed '2s/xxx/yyy/g;10s/aaa/bbb/g' file
sed -e '2s/xxx/yyy/g' -e '10s/aaa/bbb/g' file
把第二行的所有xxx换成yyy,第十行所有aaa换成bbb
sed 's/xxx/yyy/w file2' file1
把每一行的第一个xxx换成yyy,被更换的行将被输出到file2
sed '/xxx/r file2' file1
在有xxx的行的后面追加file2的所有文本内容
sed 's!xxx!yyy!g' file
把所有xxx都换成yyy,当file中有大量的/时,用s/xxx/yyy/g可能会造成错误,而其实s/xxx/yyy/g中的/可以用其他字符代替,比如!,#
sed '/xxx/{n;d;}' file
把带有xxx的行的下一行读入到模式空间,并删除
sed 'y/abc/def/' file
把a换成d,b换成e,c换成f
sed '/xxx/{N;s/\n//;}' file
把有xxx的行的下一行追加到模式空间,并删除第一个回车符
sed '/^$/{N;/xxx/D;}' file
如果空行后面的一行带有字符串xxx,则删除空行
sed -e '/xxx/,/yyy/{H;d}' -e '/zzz/G' file
把xxx到yyy之间的所有行都剪切到zzz行后面,只能把文本前面的行剪切到后面
sed '$!G' file
除最后一行外,每一行的后面追加一条空行
sed 's/\(xxx\) yyy/\1 zzz/g' file
把字符串xxx yyy中的’ yyy’换成’ zzz’,(xxx)表示锁定xxx,即不改变xxx,\1表示锁定的元素是字符串的第一个元素
sed -n '/\<xxx\>/p' file
打印含有xxx单词的行
sed -n '/\<xxx/p' file
打印以xxx为开头的单词的行
sed -n '/xxx\>/p' file
打印以xxx为结尾的单词的行
查看有哪几个启动项
sed -n 's/menuentry '\''//1;s/'\'' --class.*//1p' /boot/grub2/grub.cfg
单引号反斜杠单引号单引号 意思是转义单引号,使其变成一个普通的无意义的字符;正则表达式中不能只用反斜杠转义单引号
用分号分开的两条命令没有因果关系,不管第一条有没有成功,都会执行第二条
-n与p的组合的意思是只打印操作的行,因为只有启动项的行有【’ –class】,所以只会打印启动项的行