繁体   English   中英

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

[英]Difference between grep and perl regex?

我有一个问题,我认为 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 无法使用相同的表达式更新文件。 我应该如何解决这个问题?

Perl 想要转义 '(' 和 ')'。 此外,外壳会吃掉“$”上的“\\”,因此您需要:

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

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

您需要逃脱() (捕获组)。

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

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

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

如果要修改使用

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

Perl 的正则表达式语法与 grep 使用的 POSIX 正则表达式不同。 在这种情况下,您会遇到 Perl 正则表达式中作为元字符的括号的问题——它们表示捕获组。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM