我想用一个用户输入生成的字符串替换目录下所有文件中的占位符。此输入可以包含/ : . ~
我为此任务选择了Perl。
perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`
现在,~
是Perl中的保留字符。如何在~
中逃避$user_input
? \~
不起作用。
答案 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
,以避免命中命令行长度限制。