Konvertieren zwischen einem Vim-Ersatz und einem Perl-Pie-Ersatz

Konvertieren zwischen einem Vim-Ersatz und einem Perl-Pie-Ersatz

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 ;/gkonvertiert 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 perlrehat dies zu sagen zu $1vs \1im 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.

verwandte Informationen