Perl one liner regex throw bash:意外令牌附近的语法错误`)'

时间:2012-03-16 20:34:58

标签: regex perl bash

我有一个PERL one liner我正在尝试使用包含逗号分隔的电子邮件地址列表的配置文件。

perl -nle 'print for m/\* Members= (\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*$/i)/g'

返回bash:

syntax error near unexpected token `)'

似乎正则表达式在shell上运行得不好。我怀疑某些东西没有被正确转义,但由于错误的性质,正则表达式本身我不知道在哪里看。有什么想法吗?

3 个答案:

答案 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

我不确定你的正则表达式是否符合你的要求,请显示文件的某些行以便给出更好的答案。