texto sustituir script reemplazar para linea insertar especiales espacios eliminar comando caracteres blanco sed dry

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