Also kann ich in der Kommandozeile bequem so etwas tun:
perl -pne "s/from/to/" in > out
Und wenn ich das wiederholen muss und / oder habe ich mehrere andere perl -pne
Transformationen, ich kann sie in sagen, a .bat
Datei in Windows. Das ist natürlich ein ziemlich umständlicher Weg. Ich sollte nur einen schreiben perl
Skript, das all diese Regex-Transformationen enthält.
Also, wie schreibst du es? Wenn ich ein Shell-Skript habe, das diese Zeilen enthält:
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
Wie kann ich das alles in einen zusammenfassen? perl
Skript?
Antworten:
10 für die Antwort № 1-e
akzeptiert beliebiges komplexes Programm. Schließen Sie sich einfach Ihren Substitutionsoperationen an.
perl -pe "s/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/" in > out
Wenn Sie wirklich ein Perl-Programm wollen, das Input und Looping explizit behandelt, sollten Sie den Einzeiler deaktivieren, um den generierten Code zu sehen und von hier aus zu arbeiten.
> 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
6 für die Antwort № 2
Verwandte Antwort auf die Frage, die Sie nicht getan haben ganz frage: die Perl Sondervariable $^I
, zusammen benutzt mit @ARGV
, gibt das In-Place-Bearbeitungsverhalten von -i
. Wie bei der Option -p zeigt Deparse den generierten Code an:
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 $_;
}