Linux 正则表达式

本文详细介绍了正则表达式的常用符号及其在文本编辑器、grep和sed中的应用。通过实例展示了如何利用sed进行文本处理,包括查找、替换、插入等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特殊字符

基础

  • ^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;}:不更新模式空间的情况下进行多个命令
功能参数
  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】,所以只会打印启动项的行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值