在Perl中使用〜搜索并替换

时间:2016-08-26 14:35:57

标签: perl replace

我想用一个用户输入生成的字符串替换目录下所有文件中的占位符。此输入可以包含/ : . ~

我为此任务选择了Perl。

perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`

现在,~是Perl中的保留字符。如何在~中逃避$user_input\~不起作用。

1 个答案:

答案 0 :(得分:9)

实际上,~在双引号字符串文字中并不特殊,例如s///的替换表达式。然而,其他一些是特别的。在您列出的四个字符中,/在将/用作分隔符时非常特殊。

不要尝试从shell生成Perl代码!使用以下之一:

export $user_input
perl -i -pe's/__MY_PLACEHOLDER__/$ENV{user_input}/g'

USER_INPUT=$user_input perl -i -pe's/__MY_PLACEHOLDER__/$ENV{USER_INPUT}/g'

perl -i -pe'
   BEGIN { $user_input = shift }
   s/__MY_PLACEHOLDER__/$user_input/g
' "$user_input"

顺便说一句,你真的错过了xargs

的观点
perl ... `find my_dir -type f -print0 | xargs -0`

没什么不同
perl ... `find my_dir -type f`

你想要的是

find my_dir -type f -print0 | xargs -0 perl ...

这会将文件名传递给perl unmangled。如果需要,它甚至可以使用不同批次的参数多次调用perl,以避免命中命令行长度限制。