我想用用户输入生成的字符串替换目录下所有文件中的占位符。此输入可以包含 /: 。 〜
我选择 Perl 来完成这项任务。
perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`
现在,~
是 Perl 中的保留字符。如何在 $user_input
中转义 ~
? \~
不起作用。
最佳答案
实际上,~
在双引号字符串字面量中并不特殊,例如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
。如有必要,它甚至会使用不同批处理的参数多次调用 perl
,以避免达到命令行长度限制。
关于perl - 在 Perl 搜索和替换中使用 ~,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168812/