Pregunta

Necesito iterar sobre los archivos en un directorio y realizar el siguiente reemplazo.

Antes :

  

Hola $ {USER_NAME}, vives en   $ {HOME_ADDRESS}. Ahora es $ {TIME}

After:

  

Hola $ {nombre de usuario}, vives en   $ {homeAddress}. Ahora es $ {time}

El número de tokens diferentes que aparecen dentro de $ {} es grande, por lo que no es posible ejecutarlos:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

etc.

Espero que sea posible realizar este reemplazo con un solo comando, que se parece a algo como:

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

Pero no puedo averiguar qué sustituir por XXX y YYY. ¿Es posible hacer esto en un solo comando?

Saludos, Donal

¿Fue útil?

Solución

El indicador -i para sed editará un archivo en el lugar. Para XXX y YYY, usarías algo como:

sed -i 's/USER_NAME/userName/g'

y así sucesivamente.

Actualización: veo que su pregunta fue realmente acerca de cambiar " USER_NAME " en " nombre de usuario " automáticamente. Puedes probar este script Perl:

sub convert {
    my $r = lc 

El indicador -i para sed editará un archivo en el lugar. Para XXX y YYY, usarías algo como:

sed -i 's/USER_NAME/userName/g'

y así sucesivamente.

Actualización: veo que su pregunta fue realmente acerca de cambiar " USER_NAME " en " nombre de usuario " automáticamente. Puedes probar este script Perl:

perl -i convert.pl inputfile.txt

Ejecutalo de esta manera:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}

Salida de muestra:

<*>[0]; $r =~ s/_(.)/\U$1\E/g; return $r; } while (<>) { s/\${([A-Z_]+)}/\${@{[convert $1]}}/g; print; }

Ejecutalo de esta manera:

<*>

Salida de muestra:

<*>

Otros consejos

Formato para mayor claridad:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

Donde / ^ Hello / identifica las líneas en las que desea actuar (hágalo más específico si es necesario) y el resto sustituye el nombre de cada variable.


Si escribe esto en un script, considere el uso de un documento AQUÍ para mantener el formato y facilitar su lectura y actualización ...

La respuesta anterior funciona muy bien. Para completar, puedo agregar que puedes hacer:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

Son funcionalmente idénticos (excepto que el mío se descarga en la salida estándar; tendrás que ponerlo en alguna parte (pero puedes mantener el original en caso de que, como e, te arruines regularmente en tus expresiones regulares). Me gusta mi formulación solo porque puedo comenzar con el comando one sed, luego agregar más con

!! | sed 'yet-enother-regexp'

¿Teclas de flecha? modo vi? ¿Quién necesita esas cosas? :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top