正则表达式

threcial 发布于 13 天前 22 次阅读


Linux 中最常见的文本处理工具是:grep、sed、awk,也就是常说的“文本三剑客”

  • grep:查找、过滤符合条件的行

  • sed:按行编辑、替换、删除、插入文本

  • awk:按列处理、条件判断、统计计算

正则表达式就是给这些工具提供匹配规则的语言,它不是普通命令本身,而是一套用于描述文本模式的规则

正则表达式和 Shell 通配符:两者会使用相同的符号,这些符号也有相近的意思,但二者完全不相同,需要注意区分

Linux 中常见的正则表达式主要分为两类:

  • BRE:Basic Regular Expression,基础正则表达式
  • ERE:Extended Regular Expression,扩展正则表达式

grep sed awk 默认都支持基础正则表达式,但是使用扩展正则表达式就需要使用参数

基础正则常见符号

1. ^:匹配行首

^ 表示一行的开头

grep '^root' /etc/passwd      查找以 root 开头的行

2. $:匹配行尾

$ 表示一行的结尾

grep 'bash$' /etc/passwd    查找以 bash 结尾的行

3. ^$:匹配空行

^ 是行首,$ 是行尾,如果中间什么都没有就表示空行

^$

4. .:匹配任意单个字符

. 表示任意一个字符,但必须有一个字符

grep 'r..t' file.txt      查找 r t 之间存在两个字符的行
grep '.' file.txt         查找任意非空行

5. \:转义字符

有些字符在正则里有特殊含义,比如上述4个字符,如果想匹配它们本身,就需要使用反斜杠转义

grep '\.$' file.txt     匹配以点号结尾的行

6. *:前一个字符重复 0 次或多次

* 在通配符中表示任意内容,而在正则表达式中表示让前一个字符重复 0 次或多次

grep 'go*d' file.txt

可以匹配 gd god good 等

7. .*:任意长度内容

这是最常用的组合之一

grep '^.*n' linux.txt    表示从行首开始,匹配到最后一个 n 为止

注意:默认情况下,正则里的 * 通常是贪婪的,会尽可能多地匹配

8. []:字符集合

[] 表示匹配集合中的任意一个字符

grep '[abc]' file.txt          匹配 a、b、c 中任意一个
grep '[135acbyp]' file.txt     字符数字混合
grep '[a-c]' file.txt          范围写法
grep '[0-9]' file.txt          数字范围
grep '[0-9a-zA-Z]' file.txt    多个范围

9. [^]:字符集合取反

[^] 表示匹配不在集合中的任意一个字符

grep '[^0-9]' file.txt         匹配包含有非数字的行

扩展正则常见符号

要使用扩展正则, grep 和 sed 需要使用 -E 参数,而 awk 可以直接使用

1. +:前一个字符出现 1 次或多次

grep -E 'go+d' file.txt

可以匹配 god good goood 等

2. ?:前一个字符出现 0 次或 1 次

grep -E 'go?d' file.txt

可以匹配 gd god 仅此两个

3. |:或者

grep -E 'linux|weibo' passwd    匹配包含 linux 或 weibo 的行
grep 'linux|weibo' passwd      如果不加 -E 就会查找  linux|weibo 而没有或者的含义

4. {n,m}:控制重复次数

{} 用于指定前一个字符或分组重复的次数

grep -E '[0-9]{3}' file.txt      匹配连续 3 个数字
grep -E '[0-9]{2,4}' file.txt    匹配 2 到 4 个数字
grep -E '[0-9]{2,}' file.txt     匹配至少 2 个数字
grep -E '[0-9]{,4}' file.txt     匹配至多 4 个数字

5. ():分组

() 可以把多个字符或表达式看成一个整体

grep -E 'g(oo|ww)d' file.txt

可以匹配 good 和 gwwd

6. \1\2:反向引用

反向引用表示引用前面分组匹配到的内容,\1 表示第一个,\2 表示第二个,以此类推

grep -E '([a-z]+)\1' file 

匹配至少一个的小写字母字符串并且这个字符串需要重复出现一次