¿Es posible usar gawk
la -i inplace
opción y también imprimir cosas stdout
?
Por ejemplo, si quisiera actualizar un archivo, y si hay algún cambio, imprima el nombre del archivo y las líneas cambiadas, stderr
podría hacer algo como
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
pero, ¿hay alguna forma de usarla stdout
o una forma más limpia de imprimir ese bloque en la secuencia alternativa?
grep
puede ser. Mi primer instinto es evitar tener que "procesar" el archivo dos veces, pero no me sorprendería en absoluto si de todos modos es más rápido. Simplemente muestra por qué puedo confiar en mi instinto en las tareas de creación de perfiles
-print -exec gawk
ya no se ejecuta) y 2) se detendrá en la primera coincidencia, a menos que la primera coincidencia esté en el última línea todavía no está procesando todo el archivo dos veces (es más como 1.X veces). Además, si gawk -i inplace
funciona así sed -i
, editará el archivo en el lugar de todos modos, es decir, actualizar las marcas de tiempo, el inodo, etc., incluso si no hubiera nada que editar ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
, solo usará awk para editar los archivos que realmente contienen líneas que coinciden con ese patrón.