使用 -p 将参数传递给 perl
Passing a parameter to perl with -p
我有一个简短的 perl 脚本,可以运行正则表达式替换文件:
perl -pi -e 's/x/y/' <file>
我想将一个参数传递给脚本,因此它会将 y 替换为命令行参数(例如,类似 perl -pi -e 's/x/$argv[1]/' <file>
但我使用 $argv[1] 在使用 -pi 参数时不起作用.
我一直不理解一行 Perl 程序的全神贯注,我不明白为什么你不能写一个 Perl 脚本文件来做这个。
但是,您可以在 -p
循环开始之前从 @ARGV
中删除一个项目并将其保存在一个变量中。像这样
perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement>
perl -pi -e 's/x/y/' <file>
等同于:
while (<>) {
s/x/y/;
}
continue {
print or die "-p failed: $!\n";
}
这将通过表达式 s/x/y/;
传递 <file>
的每一行并打印结果。 (注意 -i 标志将修改 <file>
就地)。如果你真的需要传入替换,你为什么不直接在替换中列出它。无论哪种方式,它仍然只列出一次。
perl -pi -e 's/x/<replacement>/;' <file>
解决方案 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:使用环境变量而不是参数
R="$replacement" perl -i -pe's/x/$ENV{R}/' "$file"
我有一个简短的 perl 脚本,可以运行正则表达式替换文件:
perl -pi -e 's/x/y/' <file>
我想将一个参数传递给脚本,因此它会将 y 替换为命令行参数(例如,类似 perl -pi -e 's/x/$argv[1]/' <file>
但我使用 $argv[1] 在使用 -pi 参数时不起作用.
我一直不理解一行 Perl 程序的全神贯注,我不明白为什么你不能写一个 Perl 脚本文件来做这个。
但是,您可以在 -p
循环开始之前从 @ARGV
中删除一个项目并将其保存在一个变量中。像这样
perl -p -i -e 'BEGIN{ $r = pop } s/x/$r/' <file> <replacement>
perl -pi -e 's/x/y/' <file>
等同于:
while (<>) {
s/x/y/;
}
continue {
print or die "-p failed: $!\n";
}
这将通过表达式 s/x/y/;
传递 <file>
的每一行并打印结果。 (注意 -i 标志将修改 <file>
就地)。如果你真的需要传入替换,你为什么不直接在替换中列出它。无论哪种方式,它仍然只列出一次。
perl -pi -e 's/x/<replacement>/;' <file>
解决方案 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:使用环境变量而不是参数
R="$replacement" perl -i -pe's/x/$ENV{R}/' "$file"