本文共 1228 字,大约阅读时间需要 4 分钟。
正则表达式在Unix/Linux环境下的使用可能会让人感到困惑。虽然 Hiringioriate ir enclosure, aubun都知道 d
和 [a-z]+
这些表达式,它们分别匹配数字字符和小写字母字符。但如果你使用过vi、grep、awk、sed等工具,你会发现这些工具虽然支持正则表达式,但语法有很大不同,甚至常见的表达式可能无法正常匹配或会出现错误。此外,这些工具之间也存在差异,同样的结构可能需要转义或不需要转义,这背后有着深刻的原因。
Unix/Linux工具大多采用POSIX规范,而POSIX规范又可分为两大流派:
(a)b
只能匹配 (a)b 而非ab。而像 {1,2}
只有在转义后才可以正确匹配多次字符。这种转义是由于这些工具的开发时间较早,且正则表达式功能逐步扩展而产生的兼容性需求。(ab|cd)
可以直接匹配ab或cd。此外,量词和其他功能如\1
反向引用在这些工具中通常得到了支持。流派 | 说明 | 工具 |
---|---|---|
BRE | (、)、{、} 必须转义 | grep、sed、vi |
GNU BRE | 类似BRE,但支持 \+ 和 \? | GNU grep、GNU sed |
ERE | 元字符不需转义 | egrep、awk |
GNU ERE | 类似ERE,但支持反向引用 | grep –E、GNU awk |
除了正则表达式之外,POSIX规范还定义了字符组表示法(bracket expression):
[:digit:]
只能匹配保存和d
这两个字符。[a-]
匹配a
和-
,而 []]
匹配]
和a
。字符组 | ASCII语言环境 | Unicode语言环境 |
---|---|---|
[:alnum:] | [a-zA-Z0-9] | [\p{L}\p{Nd}] |
[:alpha:] | [a-zA-Z] | \p{L} |
[:cntrl:] | [^\t\n\x00-\x1F\x7F] | \p{Cc} |
[:digit:] | [0-9] | \p{Nd} |
[:space:] | [ \t\r\n\v\f] | [\p{Z}\t\r\n\v\f] |
理解POSIX规范的重要性,尤其是在处理不同工具和正则表达式时至关重要。在实际操作中,明确工具的正则表达式风格并遵循对应的规则,可以避免误解和匹配错误。通过熟悉这些差异,你可以更高效地使用Unix/Linux工具进行数据处理和分析。
转载地址:http://vzzfk.baihongyu.com/