如何正确转义Perl饼的搜索字符串

时间:2014-01-16 10:32:58

标签: regex perl

我使用这个经典的perl one liner来递归替换多个文件中的字符串

perl -pi -e 's/oldstring/newstring/g' `grep -irl oldstring *`

但这让我失望,因为我想找到字符串:

'$user->primaryorganisation->id'

并替换为

$user->primaryorganisation->id

我似乎无法正确转义字符串以使该行成功运行。

感激不尽的任何帮助!

3 个答案:

答案 0 :(得分:3)

试试这个。很多逃脱。使用TLP建议并使用源文件。

perl -pi -e "s/'\\\$user->primaryorganisation->id'/\\\$user->primaryorganisation->id/g" `grep -irl  "'\$user->primaryorganisation->id'" *`

说明:

  • 三个反斜杠:前两个告诉shell产生一个字面反斜杠;第三个逃脱壳的$;这使Perl成为\$,需要反斜杠来转义变量插值
  • 双引号"将单引号'放入其中
  • 为grep提供一个反斜杠和一个美元\$,以便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' {} +