我想在所有包含“foo”的文件中用“bar(”)替换所有出现的“foo”。我试过了
perl -pie 's/foo/bar\(/g' `grep -ril foo .`
但这只是挂起而没有任何反应。我试过改变左括号前面的转义反斜杠的数量,但没有成功。我正在使用bash 4.1.5。
如果我删除左括号,替换工作正常。有谁知道如何逃避左括号?
答案 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'