我想用一个用户输入生成的字符串替换目录下所有文件中的占位符.此输入可以包含/ : . ~
我选择Perl来完成这项任务.
perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`
Run Code Online (Sandbox Code Playgroud)
现在,~是Perl中的保留字符.我怎样才能逃避~的$user_input?\~不起作用.
实际上,~双引号字符串文字并不特别,例如替换表达式s///.然而,其他一些是特别的.在您列出的四个字符中,/特殊/用作分隔符时就像这里的情况一样.
不要尝试从shell生成Perl代码!使用以下之一:
export $user_input
perl -i -pe's/__MY_PLACEHOLDER__/$ENV{user_input}/g'
Run Code Online (Sandbox Code Playgroud)
要么
USER_INPUT=$user_input perl -i -pe's/__MY_PLACEHOLDER__/$ENV{USER_INPUT}/g'
Run Code Online (Sandbox Code Playgroud)
要么
perl -i -pe'
BEGIN { $user_input = shift }
s/__MY_PLACEHOLDER__/$user_input/g
' "$user_input"
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你真的错过了重点xargs!
perl ... `find my_dir -type f -print0 | xargs -0`
Run Code Online (Sandbox Code Playgroud)
没有什么不同
perl ... `find my_dir -type f`
Run Code Online (Sandbox Code Playgroud)
你想要的是什么
find my_dir -type f -print0 | xargs -0 perl ...
Run Code Online (Sandbox Code Playgroud)
这会将文件名传递给perlunmangled.perl如果有必要,它甚至会使用不同批次的参数调用多次,以避免命中命令行长度限制.