所以在命令行我可以方便地做这样的事情:
perl -pne 's/from/to/' in > out
如果我需要重复这个和/或我还有其他几个perl -pne
转换,我可以将它们放在Windows中的.bat
文件中。当然,这是一种相当迂回的方式。我应该编写一个具有所有正则表达式转换的perl
脚本。
那你怎么写呢?如果我有一个包含这些行的shell脚本:
perl -pne 's/from1/to1/' in > temp
perl -pne 's/from2/to2/' -i temp
perl -pne 's/from3/to3/' -i temp
perl -pne 's/from4/to4/' -i temp
perl -pne 's/from5/to5/' temp > out
如何将这些全部放入一个perl
脚本?
答案 0 :(得分:10)
-e
接受任意复杂的程序。所以加入你的替换操作吧。
perl -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/' in > out
如果你真的想要一个处理输入和循环显式的Perl程序,请解析单行程序以查看生成的代码并从此处开始工作。
> perl -MO=Deparse -pe 's/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/'
LINE: while (defined($_ = <ARGV>)) {
s/from1/to1/;
s/from2/to2/;
s/from3/to3/;
s/from4/to4/;
s/from5/to5/;
}
continue {
print $_;
}
-e syntax OK
答案 1 :(得分:6)
您没有完全提出的问题的相关答案:与$^I
一起使用的perl special variable @ARGV
提供了就地编辑行为-i
。与-p选项一样,Deparse将显示生成的代码:
perl -MO=Deparse -pi.bak -le 's/foo/bar/'
BEGIN { $^I = ".bak"; }
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
s/foo/bar/;
}
continue {
print $_;
}