sustituir - comando sed en ejecución en seco
sed linux reemplazar (3)
Preferiría usar la opción p:
find ./ -type f | xargs sed ''s/string1/string2/gp''
Podría combinarse con el parámetro --quiet para obtener una salida menos detallada:
find ./ -type f | xargs sed --quiet ''s/string1/string2/gp''
Del man sed
:
pag:
Imprime el espacio del patrón actual.
--tranquilo:
suprimir la impresión automática de espacio de patrones
No puedo averiguar si es posible hacer una carrera en seco con sed y cómo hacerlo.
Así que tengo este comando:
find ./ -type f | xargs sed -i ''s/string1/string2/g''
Pero antes de que realmente lo sustituya en todos los archivos, quiero verificar qué Sustituiría. ¡Copiar toda la estructura de directorios para verificar no es una opción!
Gracias por cualquier comentario (negativo o positivo :))
Retire el -i
y páselo a less
para paginar a través de los resultados. Alternativamente, puede redireccionar todo a un archivo grande quitando el -i
y añadiendo > dryrun.out
Debo señalar que esta secuencia de comandos fallará miserablemente con archivos que contengan espacios en su nombre u otros personajes infames como nuevas líneas o cualquier otra cosa. Una mejor forma de hacerlo sería:
while IFS= read -r -d $''/0'' file; do
sed -i ''s/string1/string2/g'' "$file"
done < <(find ./ -type f -print0)
Sé que este es un hilo muy viejo y el OP realmente no necesita esta respuesta, pero vine aquí en busca de un modo de ejecución en seco, así que pensé en agregar el siguiente consejo para cualquiera que venga aquí en el futuro. Lo que quería hacer era evitar pisotear el archivo de copia de seguridad a menos que haya algo realmente cambiante. Si ejecutas ciegamente sed usando la opción -i
con el sufijo de copia de seguridad, el archivo de copia de seguridad existente se sobrescribe, incluso cuando no hay nada sustituido.
La forma en que terminé haciendo es conectar la salida sed a diff y ver si algo cambió y luego volver a ejecutar con la opción de actualización in situ, algo como esto:
if ! sed -e ''s/string1/string2/g'' $fpath | diff -q $fpath - > /dev/null 2>&1; then
sed -i.bak -e ''s/string1/string2/g'' $fpath
fi
Según la pregunta de OP, si el requisito es simplemente ver lo que cambiaría, entonces, en lugar de ejecutar el in-pace sed, podría volver a hacer diff con algunos mensajes informativos:
if ! sed -e ''s/string1/string2/g'' $fpath | diff -q $fpath - > /dev/null 2>&1; then
echo "File $fpath will change with the below diff:"
sed -e ''s/string1/string2/g'' $fpath | diff $fpath -
fi
También puede capturar el resultado en una variable para evitar hacerlo dos veces:
diff=$(sed -e ''s/string1/string2/g'' $fpath | diff $fpath -)
if [[ $? -ne 0 ]]; then
echo "File $fpath will change with the below diff:"
echo "$diff"
fi