运行以下内容时出错:
perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file
错误:
Unmatched [ in regex; marked by <-- HERE in m/[A-G][ <-- HERE \d|\s|m|#|5.022001/ at -e line 1, <> line 1
我通过在行尾转移]
来解决错误:
perl -ne 'print unless (/[A-G][\d|\s|m|#|$\]/)' file
为什么我必须逃离最后]
?什么阻止支架匹配?
我注意到所有[]
个匹配都不是这种情况。这是一个特例吗?
答案 0 :(得分:7)
我认为$
需要在那里进行转义,因为$]
是用于The revision, version, and subversion of the Perl interpreter的特殊变量
答案 1 :(得分:4)
perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file
显然,$]
被Perl解释为$]
变量,其中包含当前版本的Perl。
但是正则表达式无论如何都没有多大意义。在这部分内容:
[\d|\s|m|#|$]
[
和]
之间的文本是一系列字符或字符范围,表达式与这些字符中的任何一个都匹配。添加反斜杠:
[\d|\s|m|#|\$]
意味着它将匹配单个反斜杠,'d','s',m','$','|'或'$'字符。 (我不是百分之百确定细节。)你可能想要:
(\d|\s|m|#|$)
如果您不希望匹配的文字存储在$1
:
(?:\d|\s|m|#|$)
但这可能不值得这个单线。
此外,外括号不是必需的。把这些全部放在一起,你可能想要的是:
perl -ne 'print unless /[A-G](\d|\s|m|#|$)/' file