在Perl中使用〜搜索并替换

Apo*_*sia 2 perl replace

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

我选择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\~不起作用.

ike*_*ami 9

实际上,~双引号字符串文字并不特别,例如替换表达式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如果有必要,它甚至会使用不同批次的参数调用多次,以避免命中命令行长度限制.