![Konvertieren zwischen einem Vim-Ersatz und einem Perl-Pie-Ersatz](https://rvso.com/image/1316127/Konvertieren%20zwischen%20einem%20Vim-Ersatz%20und%20einem%20Perl-Pie-Ersatz.png)
Ich habe also eine Datei test.txt, die enthält:
home -> range
Wenn ich die Datei in vim bearbeite und den Befehl ausführe, %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
konvertiert es die Datei in
range ::= home ;
das ist, was ich will. Wenn ich jedoch
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
was meiner Meinung nach dasselbe bewirken sollte, ich bekomme keine Änderung - kann mir jemand sagen, was schiefgelaufen ist? Ich vermute, dass etwas maskiert werden muss, aber ich habe alle möglichen Kombinationen von Maskierungen ausprobiert ... außerdem hätte ich gerne einige allgemeine Regeln zur Konvertierung zwischen den beiden Formaten ...
Antwort1
In Perl entkommen Sie den Erfassungsklammern nicht und es ist auch üblich, für die Erfassungsvariablen $1,$2 anstelle von \1,\2 zu verwenden.
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
Es ist eine bedauerliche Tatsache, dass diereguläre Ausdrücke(RE), die in vielen gängigen Tools (vim, sed, awk, perl) verwendet werden, unterscheiden sich geringfügig. Einige Tools bieten die Option, Perl REs, POSIX Basic REs (BRE) oder POSIX Extended REs (ERE) zu verwenden.
perldoc perlre
hat dies zu sagen zu $1
vs \1
im Ersatzteil eines Substitutionsausdrucks
Manche Leute gewöhnen sich zu sehr daran, Dinge zu schreiben wie:
$pattern =~ s/(\W)/\\\1/g;
Dies ist für die rechte Seite eines Ersatzes Bestandsschutz, um Sed-Süchtige nicht zu schockieren, aber es ist eine schlechte Angewohnheit. Das liegt daran, dass in PerlThink die rechte Seite eines „s///“ eine Zeichenfolge in doppelten Anführungszeichen ist. „\1“ in der üblichen Zeichenfolge in doppelten Anführungszeichen bedeutet ein Strg-A. Die übliche Unix-Bedeutung von „\1“ wird für „s///“ eingepfuscht. Wenn Sie sich das jedoch angewöhnen, geraten Sie in Schwierigkeiten, wenn Sie dann einen „/e“-Modifikator hinzufügen.