È possibile usare gawk
l' -i inplace
opzione e anche stampare gli oggetti stdout
?
Ad esempio, se volessi aggiornare un file, e se ci fossero delle modifiche, stampa il nome del file e le righe cambiate stderr
potrei fare qualcosa di simile
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;}' {} +
ma c'è un modo di usare stdout
invece, o un modo più pulito per stampare quel blocco sul flusso alternativo?
grep
può essere più veloce . Il mio primo istinto è quello di evitare di dover "elaborare" il file due volte, ma non sarei affatto sorpreso se fosse comunque più veloce. Ciò dimostra semplicemente perché posso fidarmi del mio istinto nei compiti di profilazione
-print -exec gawk
non viene più eseguita) e 2) si fermerà alla prima corrispondenza quindi a meno che la prima non sia sulla ultima riga non stai ancora elaborando l'intero file due volte (è più simile a 1.X volte). Inoltre, se gawk -i inplace
funziona così sed -i
, modificherà comunque il file sul posto, ovvero aggiornando timestamp, inode ecc. Anche se non c'era nulla da modificare ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
modo da utilizzare awk solo per modificare i file che contengono effettivamente linee che corrispondono a quel modello.