Więc w linii poleceń mogę wygodnie zrobić coś takiego:
perl -pne "s/from/to/" in > out
A jeśli muszę to powtórzyć i / lub mam kilka innych perl -pne
transformacje, mogę je umieścić, powiedzmy, a .bat
plik w systemie Windows. To jest raczej okrężny sposób na zrobienie tego, oczywiście. Powinienem po prostu napisać jeden perl
skrypt zawierający wszystkie te przekształcenia wyrażenia regularnego.
Więc jak to piszesz? Jeśli mam skrypt powłoki zawierający te linie:
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
Jak mogę po prostu umieścić je wszystkie w jednym perl
scenariusz?
Odpowiedzi:
10 dla odpowiedzi № 1-e
akceptuje dowolny złożony program. Dołącz do operacji zastępczych.
perl -pe "s/from1/to1/; s/from2/to2/; s/from3/to3/; s/from4/to4/; s/from5/to5/" in > out
Jeśli naprawdę chcesz, aby program Perla, który obsługuje dane wejściowe i pętle, wyraźnie, odrzuć jeden liner, aby zobaczyć wygenerowany kod i pracować z tego miejsca.
> 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 dla odpowiedzi nr 2
Powiązana odpowiedź na pytanie, którego nie zrobiłeś całkiem Zapytaj specjalna zmienna perl $^I
, używane razem z @ARGV
, daje możliwość edycji w miejscu -i
. Podobnie jak opcja -p, Deparse pokaże wygenerowany kod:
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 $_;
}