我有一个PERL one liner我正在尝试使用包含逗号分隔的电子邮件地址列表的配置文件。
perl -nle 'print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g'
返回bash:
syntax error near unexpected token `)'
似乎正则表达式在shell上运行得不好。我怀疑某些东西没有被正确转义,但由于错误的性质,正则表达式本身我不知道在哪里看。有什么想法吗?
答案 0 :(得分:8)
那是因为你有一个你希望在你的正则表达式中的单引号,但shell不知道。这一次,您可以在Perl表达式周围使用双引号:
perl -nle "print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g"
更一般地说,您需要使用'\''
技巧:
perl -nle 'print for m/\* Members= (\w+([-+.'\'']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g'
'\''
在shell中的单引号字符串中嵌入单引号;第一个引号关闭当前单引号字符串;反斜杠引用嵌入单引号;最后一个引号开始一个新的单引号字符串。
答案 1 :(得分:1)
您的问题出在您的第一个逻辑组中; '
正在关闭要评估的字符串,然后才能进行评估。
perl -nle 'print for m/\* Members= (\w+([-+.' <-- that character
尝试使用"
perl -nle "print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g"
答案 2 :(得分:1)
正如其他人所说,使用"
代替'
。
你的正则表达式结尾还有另一个错误:
([,])*)*$/i)/g
必须写:
(,)*$/ig
我不确定你的正则表达式是否符合你的要求,请显示文件的某些行以便给出更好的答案。