grep/sed/awk中正则表达式的区别
本文默认你对正则表达式有基本的了解。
本文试图让你以后使用grep/sed/awk时,不需要为他们的差异而头疼。
本文试图解释两个概念:基础正则表达式和扩展正则表达式(这两个概念的名字简直就是瞎起的,太容易让人误解了)。
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