我有一个简短的perl脚本运行正则表达式替换文件:
perl -pi -e 's/x/y/' <file>
我想将一个参数传递给脚本,因此它会用命令行参数替换y(例如perl -pi -e 's/x/$argv[1]/' <file>
之类的东西,但我使用$ argv [1]在以下情况下不起作用 - 使用pi参数。
答案 0 :(得分:5)
我从未明白对单行Perl程序的关注,我不明白为什么你不能编写Perl脚本文件来执行此操作。
但是,您可以从@ARGV
中删除项目,并在-p
循环开始之前将其保存在变量中。喜欢这个
perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement>
答案 1 :(得分:3)
解决方案1:推出自己的循环。
perl -i -e'$r = shift; while (<>) { s/x/$r/; print }' "$replacement" "$file"
解决方案2:在编译时抓取var。
perl -i -pe'BEGIN { $r = shift; } s/x/$r/' "$replacement" "$file"
解决方案3:使用env var而不是参数
R="$replacement" perl -i -pe's/x/$ENV{R}/' "$file"
答案 2 :(得分:0)
perl -pi -e 's/x/y/' <file>
等同于:
while (<>) {
s/x/y/;
}
continue {
print or die "-p failed: $!\n";
}
这将通过表达式<file>
传递s/x/y/;
的每一行并打印结果。 (注意-i标志将修改<file>
inplace)。如果您确实需要传递替换,为什么不直接在替换中列出它。无论哪种方式,它仍然只列出一次。
perl -pi -e 's/x/<replacement>/;' <file>