Conversión entre un reemplazo de vim y un reemplazo de perl pie

Conversión entre un reemplazo de vim y un reemplazo de perl pie

Entonces tengo un archivo test.txt, que contiene,

home -> range

Si edito el archivo en vim y ejecuto el comando, %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/gconvierte el archivo a

range ::= home  ;

que es lo que quiero. Sin embargo, si corro

 perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt

que creo que debería hacer lo mismo, no obtengo ningún cambio. ¿Alguien puede decirme qué salió mal? Sospecho que es necesario escapar de algo, pero le he lanzado todo tipo de combinaciones de escape... además, me gustaría conocer algunas reglas generales sobre la conversión entre los dos formatos...

Respuesta1

En Perl no se escapan los corchetes de captura, además es convencional usar $1,$2 en lugar de \1,\2 para las variables de captura.

perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt

Es un hecho desafortunado de la vida que elexpresiones regulares(RE) utilizado en muchas herramientas comunes (vim, sed, awk, perl) son todos sutilmente diferentes. Algunas herramientas tienen la opción de utilizar Perl RE, POSIX Basic RE (BRE) o POSIX Extended RE (ERE).


perldoc perlretiene esto que decir en $1vs \1en la parte de reemplazo de una expresión de sustitución

Algunas personas se acostumbran demasiado a escribir cosas como:

$pattern =~ s/(\W)/\\\1/g;

Esto está protegido por el RHS de un sustituto para evitar sorprender a los adictos a la droga, pero es un hábito sucio. Esto se debe a que en PerlThink, el lado derecho de "s///" es una cadena entre comillas dobles. "\1" en la cadena habitual entre comillas dobles significa un control-A. El significado habitual en Unix de "\1" se ha sustituido por "s///". Sin embargo, si adquiere el hábito de hacer eso, se meterá en problemas si luego agrega un modificador "/e".

información relacionada