如何逃脱perl pie one-liner中的括号?

时间:2015-03-13 21:34:09

标签: regex bash perl

我想在所有包含“foo”的文件中用“bar(”)替换所有出现的“foo”。我试过了

perl -pie 's/foo/bar\(/g' `grep -ril foo .`

但这只是挂起而没有任何反应。我试过改变左括号前面的转义反斜杠的数量,但没有成功。我正在使用bash 4.1.5。

如果我删除左括号,替换工作正常。有谁知道如何逃避左括号?

1 个答案:

答案 0 :(得分:7)

当Perl尝试打开s/foo/bar\(/g作为源文件时,您发布的内容会立即退出,因为e被视为-i的参数。

$ perl -pie 's/foo/bar\(/g' `grep -ril foo .`
Can't open perl script "s/foo/bar\(/g": No such file or directory

我猜测你运行了以下内容:

perl -i -pe's/foo/bar\(/g' `grep -ril foo .`

grep一无所获时,这将挂起。如果没有给出参数,则-i被有效忽略。程序将从STDIN读取并写入STDOUT。因此,当grep什么都不返回时,该程序将阻止等待来自STDIN的输入。

解决方案:

grep -ril foo . | xargs perl -i -pe's/foo/bar\(/ig'