texto sustituir script reemplazar para linea insertar especiales eliminar completa comando caracteres caracter regex sed grep

regex - sustituir - Usar sed y grep para buscar y reemplazar



sed reemplazar linea completa (6)

Honestamente, así como me encantan las tareas apropiadas, esta es definitivamente una tarea para Perl: es realmente más poderoso para este tipo de frases ingeniosas, especialmente para "escribir de nuevo de dónde viene" (el interruptor-perl de para usted, y opcionalmente también le permite mantener la versión anterior, por ejemplo, con un .bak adjunto, simplemente use -i.bak en -i.bak lugar).

perl -i.bak -pe ''s//.jpg|/.png|/.gif/.jpg/

en lugar de trabajo complejo en sed (si es posible) o awk ...

Estoy usando egrep -R seguido de una expresión regular que contiene alrededor de 10 uniones, así que me gusta: .jpg | .png | .gif .jpg | .png | .gif .jpg | .png | .gif etc. Esto funciona bien, ahora me gustaría reemplazar todas las cadenas encontradas con .bmp

Estaba pensando en algo así como

egrep -lR "/.jpg|/.png|/.gif" . | sed "s/some_expression/.jpg/" file_it_came_form

así que el problema aquí es cómo hago una expresión regular de unión similar en sed y cómo le digo que guarde los cambios en el archivo del que obtuvo la entrada.


Mi caso de uso fue que quería reemplazar a foo:/Drive_Letter con foo:/bar/baz/xyz En mi caso, pude hacerlo con el siguiente código. Estaba en la misma ubicación de directorio donde había gran cantidad de archivos.

find . -name "*.library" -print0 | xargs -0 sed -i '''' -e ''s/foo://Drive_Letter:/foo://bar//baz//xyz/g''

Espero que haya ayudado.

ACTUALIZAR s | foo: / Drive_letter: | foo: / ba / baz / xyz | g


No pude conseguir ninguno de los comandos en esta página para que funcionen para mí: la solución sed agregó una nueva línea al final de todos los archivos que procesó, y la solución perl no pudo aceptar suficientes argumentos de find. Encontré esta solución que funciona perfectamente:

find . -type f -name ''*.[hm]'' -print0 | xargs -0 perl -pi -e ''s/search_regex/replacement_string/g''

Esto se repetirá en el árbol de directorios actual y reemplazará search_regex con replacement_string en cualquier archivo que termine en .h o .m .

También he usado rpl para este propósito en el pasado.


Otra forma de hacer esto

find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} /;

Algo de ayuda con respecto al comando anterior

El hallazgo hará el hallazgo para usted en el directorio actual indicado por .

-name el nombre del archivo en mi caso es pom.xml puede dar comodines.

-exec ejecutar

editor de flujo sed

-i ignora el caso

s es para sustituto

/4.6.0.../ Cadena a buscar

/5.0.0.../ Cadena a reemplazar


Use este comando:

egrep -lRZ "/.jpg|/.png|/.gif" . / | xargs -0 -l sed -i -e ''s//.jpg/|/.gif/|/.png/.bmp/g''

  • egrep : encuentre líneas que coincidan utilizando expresiones regulares extendidas

    • -l : solo lista nombres de archivos coincidentes

    • -R : busca recursivamente a través de todos los directorios dados

    • -Z : use /0 como separador de registro

    • "/.jpg|/.png|/.gif" : coincide con una de las cadenas ".jpg" , ".gif" o ".png"

    • . : iniciar la búsqueda en el directorio actual

  • xargs : ejecuta un comando con el stdin como argumento

    • -0 : use /0 como separador de registro. Esto es importante para que coincida con la -Z de egrep y para evitar ser engañado por espacios y líneas nuevas en los nombres de archivos de entrada.

    • -l : use una línea por comando como parámetro

  • sed : the s tream ed itor

    • -i : reemplaza el archivo de entrada con la salida sin hacer una copia de seguridad

    • -e : use el siguiente argumento como expresión

    • ''s//.jpg/|/.gif/|/.png/.bmp/g'' : reemplace todas las ocurrencias de las cadenas ".jpg" , ".gif" o ".png" con ".bmp"


intente algo usando un bucle for

for i in `egrep -lR "YOURSEARCH" .` ; do echo $i; sed ''s/f/k/'' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done

no es bonito, pero debería hacer.