Ist es möglich , zu verwenden , gawks‘ -i inplaceOption 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, stderrkö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, stdoutdiesen Block zu verwenden , oder eine sauberere Möglichkeit, diesen Block in den alternativen Stream zu drucken?
grepkann. 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 gawkwird 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 inplacefunktioniert 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.