我认为我认为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无法使用相同的表达式更新文件。我该如何解决这个问题?
感谢您提前阅读并感谢您的帮助,感激不尽!
答案 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
然后匹配源文本中的文字括号。