我使用这个经典的perl one liner来递归替换多个文件中的字符串
perl -pi -e 's/oldstring/newstring/g' `grep -irl oldstring *`
但这让我失望,因为我想找到字符串:
'$user->primaryorganisation->id'
并替换为
$user->primaryorganisation->id
我似乎无法正确转义字符串以使该行成功运行。
感激不尽的任何帮助!
答案 0 :(得分:3)
试试这个。很多逃脱。使用TLP建议并使用源文件。
perl -pi -e "s/'\\\$user->primaryorganisation->id'/\\\$user->primaryorganisation->id/g" `grep -irl "'\$user->primaryorganisation->id'" *`
说明:
$
;这使Perl成为\$
,需要反斜杠来转义变量插值"
将单引号'
放入其中\$
,以便shell传递一个字面的美元符号答案 1 :(得分:0)
如果要在perl中表示单引号但不能,因为单行使用单引号本身,可以使用\047
,单引号的八进制代码。所以,这应该有效:
s/\047(\$user->primaryorganisation->id)\047/$1/g
我建议Maher提供 Minimal Perl ,以获得关于one-lining perl艺术的更多信息。
答案 2 :(得分:0)
制作
...'...
你可以一般使用
'...'\''...'
因此,
s/'(\$user->primaryorganisation->id)'/$1/g
变为
's/'\''(\$user->primaryorganisation->id)'\''/$1/g'
所以
find -type f \
-exec perl -i -pe's/'\''(\$user->primaryorganisation->id)'\''/$1/g' {} +