grep和perl正则表达式之间的区别?

时间:2011-10-18 10:17:12

标签: regex perl grep

我认为我认为grep的正则表达式和perl的正则表达式有所不同。考虑以下小测试:

$ cat testfile.txt 
A line of text
SOME_RULE = $(BIN)
Another line of text

$ grep "SOME_RULE\s*=\s*\$(BIN)" testfile.txt 
SOME_RULE = $(BIN)

$ perl -p -e "s/SOME_RULE\s*=\s*\$(BIN)/Hello/g" testfile.txt
A line of text
SOME_RULE = $(BIN)
Another line of text

如您所见,使用正则表达式“SOME_RULE \ s * = \ s * \ $(BIN)”,grep可以找到匹配项,但perl无法使用相同的表达式更新文件。我该如何解决这个问题?

感谢您提前阅读并感谢您的帮助,感激不尽!

4 个答案:

答案 0 :(得分:5)

Perl希望转义'('和')'。另外,shell会在'$'上吃'\',所以你需要:

$ perl -p -e "s/SOME_RULE\s*=\s*\\$\(BIN\)/Hello/g" testfile.txt

(或使用单引号 - 在任何情况下都是非常可取的。)

答案 1 :(得分:2)

您需要转义()(捕获群组)。

perl -p -e 's/SOME_RULE\s*=\s*\$\(BIN\)/Hello/g' testfile.txt

实际上你需要在扩展正则表达式(ERE)中使用它:

grep -E "SOME_RULE\s*=\s*\$\(BIN\)" testfile.txt

答案 2 :(得分:1)

perl -ne '(/SOME_RULE\s*?=\s*?\$\(BIN\)/) && print' testfile.txt

如果您想修改使用

perl -pe 's/SOME_RULE\s*?=\s*?\$\(BIN\)/Hello/' testfile.txt

答案 3 :(得分:0)

Perl的正则表达式语法与grep使用的POSIX正则表达式不同。在这种情况下,你在Perl的正则表达式中将括号变为元字符 - 它们表示捕获组。

您应该通过更改Perl正则表达式获得更多成功:

s/SOME_RULE\s*=\s*\$\(BIN\)/Hello/g

然后匹配源文本中的文字括号。