Estoy usando egrep -R
seguida de una expresión regular que contiene alrededor de 10 uniones, así como:
.jpg | .png | .gif
etc. Esto funciona bien, ahora me gustaría reemplazar todas las cadenas encontradas con.bmp
Estaba pensando en algo 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 sed
y cómo le digo que guarde los cambios en el archivo del que obtuvo la entrada.
Respuestas:
Utilice este comando:
egrep
: encuentra líneas coincidentes usando expresiones regulares extendidas-l
: solo lista los nombres de archivo coincidentes-R
: busca recursivamente en todos los directorios dados-Z
: usar\0
como separador de registros"\.jpg|\.png|\.gif"
: coincide con una de las cadenas".jpg"
,".gif"
o".png"
.
: inicia la búsqueda en el directorio actualxargs
: ejecuta un comando con stdin como argumento-0
: utilizar\0
como separador de registros. Esto es importante para hacer coincidir el-Z
deegrep
y para evitar ser engañado por espacios y líneas nuevas en los nombres de archivo de entrada.-l
: use una línea por comando como parámetrosed
: La s tream ed Itor-i
: reemplace el archivo de entrada con la salida sin hacer una copia de seguridad-e
: usa el siguiente argumento como expresión's/\.jpg\|\.gif\|\.png/.bmp/g'
: reemplaza todas las apariciones de las cadenas".jpg"
,".gif"
o".png"
con".bmp"
fuente
sed -r
para expresiones regulares extendidas. En ese punto, el patrón coincidirá con lo que se usa en egrep, y es posible que desee ponerlo en una variable para reutilizarlo.Honestamente, por mucho que me guste sed para las tareas apropiadas, esta es definitivamente una tarea para perl; es realmente más poderosa para este tipo de frases ingeniosas, especialmente para "escribirlo de nuevo de donde viene" (el
-i
interruptor de perl lo hace por usted, y opcionalmente también le permite mantener la versión anterior, por ejemplo, con un .bak adjunto, solo use-i.bak
en su lugar).en lugar de un trabajo complejo en sed (si es posible allí) o awk ...
fuente
sed
... Creo que olvidé algunas banderas para sed o tenía limitaciones.Otra forma de hacer esto
Alguna ayuda con respecto al comando anterior
La búsqueda hará la búsqueda por usted en el directorio actual indicado por
.
-name
el nombre del archivo en mi caso su pom.xml puede dar comodines.-exec
ejecutarsed
editor de flujo-i
ignorar casos
es para sustituto/4.6.0.../
Cadena a buscar/5.0.0.../
Cadena para ser reemplazadafuente
No pude hacer que ninguno de los comandos en esta página funcionara para mí: la solución sed agregó una nueva línea al final de todos los archivos que procesó, y la solución de perl no pudo aceptar suficientes argumentos de find. Encontré esta solución que funciona perfectamente:
Esto se repetirá hacia abajo en el árbol de directorios actual y se reemplazará
search_regex
conreplacement_string
cualquier archivo que termine en.h
o.m
.También he usado rpl para este propósito en el pasado.
fuente
prueba algo usando un bucle for
no es bonito, pero debería hacerlo.
fuente
|while read i
patrón permitiría la transmisión y evitaría restricciones de duración cuando los resultados de egrep fueran demasiado largosMi caso de uso fue que quería reemplazar
foo:/Drive_Letter
confoo:/bar/baz/xyz
En mi caso, pude hacerlo con el siguiente código. Estaba en la misma ubicación del directorio donde había una gran cantidad de archivos.Espero que haya ayudado.
ACTUALIZACIÓN s | foo: / Drive_letter: | foo: / ba / baz / xyz | g
fuente
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'