¿Cómo escribir un reemploop de cadena dynamic en git bash?

Esto es en Windows 10 usando el entorno Linuxy proporcionado con Git Bash.

Tengo esta línea en mi file fuente de destino:

'version' => 'v1.1.023', 

Tengo esta function en mi ~/.bash_profile :

 function tag() { .... tagname="$1" cmd="s:v[0-9]\\.[0-9]\\.[0-9]+:$tagname:g;" perl -p -i -e "$cmd" config/app.php ... } 

Cuando ejecuto el command:

 $ tag v.1.1.024 

La cadena no se reemplaza, por lo tanto, la versión no se actualiza en mi código. Intenté un script muy similar con sed en lugar de perl. El file no se está cambiando. Probé la misma syntax de reemploop de Perl en CentOS y funcionó. Tenga en count que la doble barra diagonal inversa parece ser necesaria para que el command funcione en la siguiente línea cuando se ejecuta en perl. Es decir, la representación de cadena variable del command tiene una doble barra diagonal inversa para que se convierta en un literal "." en el reemploop.

¿Algunas ideas?

-i no funciona en las comstackciones de Windows de perl .

 >perl -i -pe1 foo Can't do inplace edit without backup. 

Esa característica utiliza files anónimos, que no son compatibles con Windows. Dicho esto, no estás usando una compilation de Windows de perl sino una compilation de cygwin o similar. Podría ser que su entorno de emulación de Unix emule files anónimos, por lo que ese podría no ser el problema.

Pero si es el problema, replace -i con -i.bak lo resolverá. (Siéntase libre de seguir con rm config/app.php.bak .)


Por cierto, estás generando código Perl, que es frágil. (Los nombres de tags que contienen : \ , $ o @ harán que el código falle). En su lugar, recomiendo uno de los siguientes:

 TAGNAME="$tagname" perl -i -pe's:v[0-9]\.[0-9]\.[0-9]+:$ENV{TAGNAME}:g' config/app.php 

o

 perl -i -pe' BEGIN { $tagname = shift(@ARGV); } s:v[0-9]\.[0-9]\.[0-9]+:$tagname:g; ' "$tagname" config/app.php 

Hola, @phpguru, seguiría el principio de KISS .

Usando sed y evitando perl

6.3. ¿Cuándo debería usar sed?

Cuando necesita un progtwig pequeño y rápido para modificar palabras, líneas o bloques de líneas en un file de text.

 function tag() { tagname="$1" sed -i -e "s:v[0-9]\.[0-9]\.[0-9]\+:$tagname:g" test.php } 

Salida en mi entorno:

 m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~ $ cat .bash_profile function tag() { tagname="$1" sed -i -e "s:v[0-9]\.[0-9]\.[0-9]\+:$tagname:g" test.php } m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~ $ cat test.php 'version' => 'v1.1.023, m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~ $ tag v1.1.024 m.ortiz.montealegre@CPX-XYR3G1DTHBU MINGW64 ~ $ cat test.php 'version' => 'v1.1.024,