¿Hay alguna forma de ejecutar una búsqueda recursiva de prueba y reemplazar usando sed
, antes de ejecutarla? Solo quiero imprimir los resultados antes de hacer la búsqueda y reemplazar. Algo así como hacer eco de los resultados de,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Respuestas:
Puede ejecutar
sed
sin-i
y pasar por la salida conless
Luego, ejecute
sed
con-i.bak
para crear copias de seguridad que puede diferir despuésEditar: como se sugiere en el comentario, use
grep --null | xargs -0
. Esto hace que los nombres de archivo sean terminados por el byte nulo, lo que lo hace seguro para nombres de archivo con caracteres inusuales como nueva línea. Sí,\n
es un carácter válido en un nombre de archivo unix. Los únicos caracteres prohibidos son la barra/
y el carácter nulo.\0
fuente
grep -rl --null
ya que OP no especificó OS y-Z
significa algo diferente en BSD / OSX (descomprimir).--null
es lo mismo en GNU y BSDgrep
es (una bifurcación de) el grep de GNU en FreeBSD y NetBSD. En NetBSD,-Z
todavía significa--null
(según la página de manual), pero estoy de acuerdo: nulo es más portátil. También tenga en cuenta que ni --null ni -Z trabajan en OpenBSDsed -i '' -e s/.../
en BSDsed
(no hay opciones opcionales allí)Usar
sed
con enfind
lugar degrep
En primer lugar, emplearía en
find
lugar degrep
, y esto por tres buenas razones:find
permite una selección de archivos más precisa. Por ejemplo, sologrep -r string *.txt
generará archivos en el directorio actual; no aquellos en subdirectorios.find
viene con la poderosa-exec
opción que elimina la necesidad de toda la--null … |xargs 0
construcción.-readable
y-writable
defind
evitarán perder tiempo en archivos a los que no se puede acceder.Prueba de captura
Dicho esto,
grep
se presta para una primera prueba para ver qué se capturaría:o más específicamente:
Carrera en seco
Ahora, proceda con una
sed
carrera en seco. Lased
opción-n
es sinónimo de--quiet
yp
al final de lased
expresión imprimirá el espacio de patrón actual.o más específicamente:
Ejecución
Si todo se ve bien, emita el comando definitivo reemplazando la
sed
opción-n
por-i
"en su lugar" y quitando elp
al final.o más específicamente:
Más
find
ejemplosMás
find
ejemplos se pueden encontrar aquí .fuente