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
deegrep
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.