![Conversión entre un reemplazo de vim y un reemplazo de perl pie](https://rvso.com/image/1316127/Conversi%C3%B3n%20entre%20un%20reemplazo%20de%20vim%20y%20un%20reemplazo%20de%20perl%20pie.png)
Entonces tengo un archivo test.txt, que contiene,
home -> range
Si edito el archivo en vim y ejecuto el comando, %s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
convierte 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 perlre
tiene esto que decir en $1
vs \1
en 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".