本文默认你对正则表达式有基本的了解。
本文试图让你以后使用 grep/sed/awk 时,不需要为他们的差异而头疼。
本文试图解释两个概念:基础正则表达式和扩展正则表达式(这两个概念的名字简直就是瞎起的,太容易让人误解了)。
5 个通用匹配符:
.
任意字符*
匹配任意次数^
行开头$
行结尾[]
其中一个5 个特殊匹配符:
()
子表达式+
匹配 1 次或多次?
匹配 0 次或 1 次{}
匹配 m 到 n 次|
或awk 可以直接使用以上所有匹配符。
grep 和 sed 加上-E 参数后可以直接使用以上所有匹配符。若无-E 参数,需在特殊匹配符前加转义符\
。
事实上,所谓扩展正则表达式 (ERE),并不是对正则表达式进行了扩展。扩展正则表达式 (ERE) 能做的事,基础正则表达式 (BRE) 一样能做,只是加不加转义符的区别。如,想要匹配aa
或aaa
:
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