Ich lerne awk
und möchte wissen, ob es eine Option zum Schreiben von Änderungen in eine Datei gibt, ähnlich wie sed
bei einer -i
Option zum Speichern von Änderungen an einer Datei.
Ich verstehe, dass ich die Umleitung verwenden könnte, um Änderungen zu schreiben. Gibt es jedoch eine Möglichkeit awk
, dies zu tun?
Antworten:
In der neuesten Version von GNU Awk (seit der Veröffentlichung von 4.1.0 ) besteht die Möglichkeit, Dateien an Ort und Stelle zu bearbeiten :
Anwendungsbeispiel:
So behalten Sie das Backup:
quelle
inplace
ist tatsächlich eine Bibliothek, diegawk
gemäß der Antwort von iiSeymour enthalten ist , alsoinplace
etwas, das als enthalten sein kannincludefile
.Es sei denn, Sie haben GNU awk 4.1.0 oder höher ...
Sie haben keine Option wie die von sed.
-i
Tun Sie stattdessen Folgendes:Hinweis: Das
-i
ist keine Zauberei, es wird auch eine temporäre Datei erstellt, diesed
nur für Sie erstellt wird.Ab GNU awk 4.1.0 ...
GNU awk
Diese Funktionalität wurde in Version 4.1.0 (veröffentlicht am 10/05/2013) hinzugefügt . Es ist nicht so einfach, nur die-i
Option zu geben, wie in den veröffentlichten Anmerkungen beschrieben:Sie müssen die mitgelieferte
inplace.awk
Include-Datei verwenden, um die Erweiterung ordnungsgemäß aufzurufen:Mit der Variablen
INPLACE_SUFFIX
kann die Erweiterung für eine Sicherungsdatei angegeben werden:Ich bin froh, dass diese Funktion hinzugefügt wurde, aber für mich ist die Implementierung nicht sehr schwierig, da die Leistung von der Prägnanz der Sprache herrührt und imo
-i inplace
8 Zeichen zu lang ist .Hier ist ein Link zum Handbuch für das offizielle Wort.
quelle
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
?awk '{print $0}' file | sponge file
mitsponge
abmoreutils
.@sudo_O hat die richtige Antwort .
Das kann nicht funktionieren:
Die Shell führt die Umleitungen durch, bevor sie die Kontrolle an einen Prozess übergibt ( Umleitungen ). Durch die
>
Umleitung wird die Datei auf die Größe Null gekürzt ( Umleitung der Ausgabe ). Daher gibt es zum Zeitpunkt des Starts eines Prozesses, der aus der Datei lesen möchte, keine Daten zum Lesen.quelle
Nur ein kleiner Hack, der funktioniert
quelle
Eine Alternative ist zu verwenden
sponge
:Wo Sie
'{print $0}'
durch Ihr awk-Skript undyour_file
durch den Namen der Datei ersetzen, die Sie an Ort und Stelle bearbeiten möchten.sponge
absorbiert die Eingabe vollständig, bevor sie in der Datei gespeichert wird.quelle
sponge
ist ein Teil vonmoreutils
. Daher ist es in den meisten Systemen nicht standardmäßig vorhanden. Aber es sieht so aus, als ob zumindestsponge
selbst tragbar genug ist und fast überall ausgeführt werden kann.tee
-basiert ist, dasssponge
vor dem Aufschreiben alles in den Arbeitsspeicher gelesen wird und daher große Dateien eingefroren werden.Folgendes wird nicht funktionieren
das sollte funktionieren
quelle
Falls Sie eine Nur-AWK-Lösung wünschen, ohne eine temporäre Datei zu erstellen und mit Version! = (Gawk 4.1.0) verwendbar zu sein:
quelle
Mit Tee
Der
tee
Befehl wird ausgeführt und ausgeführt, nachdem derawk
Befehl aufgrund des Befehls beendet wurde|
.quelle