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/0como 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/0como separador de registro. Esto es importante para que coincida con la-Zdeegrepy 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.