Linux grep/sed/awk 中正则表达式的区别

Ricky. · 2019年09月08日 · 1486 次阅读

本文默认你对正则表达式有基本的了解。

本文试图让你以后使用 grep/sed/awk 时,不需要为他们的差异而头疼。

本文试图解释两个概念:基础正则表达式和扩展正则表达式(这两个概念的名字简直就是瞎起的,太容易让人误解了)。

grep/sed/awk 中正则表达式的区别

5 个通用匹配符:

  • . 任意字符
  • * 匹配任意次数
  • ^ 行开头
  • $ 行结尾
  • [] 其中一个

5 个特殊匹配符:

  • () 子表达式
  • + 匹配 1 次或多次
  • ? 匹配 0 次或 1 次
  • {} 匹配 m 到 n 次
  • |

awk 可以直接使用以上所有匹配符。

grep 和 sed 加上-E 参数后可以直接使用以上所有匹配符。若无-E 参数,需在特殊匹配符前加转义符\

事实上,所谓扩展正则表达式 (ERE),并不是对正则表达式进行了扩展。扩展正则表达式 (ERE) 能做的事,基础正则表达式 (BRE) 一样能做,只是加不加转义符的区别。如,想要匹配aaaaa

BRE 写法:grep 'a\{2,3\}'

ERE 写法:grep -E 'a{2,3}'

又如,对于以下文件:

a+
aaa

grep '^a+$' 匹配第一行。 等价于grep -E '^a\+$'

grep '^a\+$' 匹配第二行。 等价于 grep -E '^a+$'

建议

在三剑客中,以下 5 个匹配符也非常有用。

  • 空格 空格
  • \< \> 单词左右边界
  • [[:blank:]] 空白字符(空格和制表符)
  • [[:graph:]] 非空白字符
  • [[:punct:]] 标点符号

个人建议,在 grep/sed/awk 中只使用本文列出的 15 个匹配符,未列出的其他匹配符,有的支持有的不支持,容易记错 (如: awk 不支持\b)。

参考

https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册