Ist es möglich , zu verwenden , gawk
s‘ -i inplace
Option und auch drucken Dinge stdout
?
Wenn ich beispielsweise eine Datei aktualisieren wollte und Änderungen vorgenommen wurden, den Namen der Datei und die geänderten Zeilen zu drucken, stderr
könnte ich so etwas tun
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;}' {} +
Aber gibt es eine Möglichkeit, stdout
diesen Block zu verwenden , oder eine sauberere Möglichkeit, diesen Block in den alternativen Stream zu drucken?
grep
kann. Mein erster Instinkt ist, zu vermeiden, dass die Datei zweimal "verarbeitet" werden muss, aber ich wäre überhaupt nicht überrascht, wenn sie tatsächlich schneller ist. Es zeigt nur, warum ich bei Profilierungsaufgaben meinem Bauch vertrauen kann
-print -exec gawk
wird nicht mehr ausgeführt) und 2) sie stoppt bei der ersten Übereinstimmung, es sei denn, die erste Übereinstimmung ist auf der In der letzten Zeile verarbeiten Sie immer noch nicht die gesamte Datei zweimal (es ist eher 1.X-mal). Wenn es so gawk -i inplace
funktioniert sed -i
, wird die Datei trotzdem an Ort und Stelle bearbeitet - dh Zeitstempel, Inode usw. werden aktualisiert, auch wenn nichts zu bearbeiten war ...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
Sie verwenden awk nur, um die Dateien zu bearbeiten, die tatsächlich Linien enthalten, die diesem Muster entsprechen.