Speichern Sie änderungen mit awk
Lerne ich awk
und ich würde gerne wissen, ob es eine option, um die änderungen schreiben, um die Datei, ähnlich wie sed
wo würde ich -i
option zum speichern von änderungen an einer Datei.
Ich verstehe, dass ich verwenden könnte, die Umleitung zu änderungen schreiben. Allerdings ist es eine option, in awk
zu tun?
- Siehe auch serverfault.com/a/547331/313521 für die Allgemeine Antwort zu "Bearbeiten einer Datei mit redirection".
- Die Lösung es ist furchtbar zerbrechlich. Es gibt absolut keine Garantie über die Reihenfolge der Ereignisse, und die Verwendung dieser Lösung könnte abgeschnitten Ihre Daten. Als ein beiseite, ich kann nicht kommentieren, die Website direkt, da brauche ich 50 rep auf dieser Website zu tun. Ich werde nie verstehen, warum SO zersplittert in Unix/Linux und server admin, et al. IMO, das war ein Fehler.
- Garantie auf die Reihenfolge der Ereignisse", das ist tatsächlich falsch. Nur die zerbrechlichkeit, die Lösung ist, wenn die Länge der Inhalte ist größer als die maximale Länge für einen Befehl. Die Reihenfolge der Ereignisse, ist jedoch garantiert.
- Was standard garantiert, dass die Bestellung?
- es ist garantiert durch die bash-Dokumentation. Für andere shells, weiß ich nicht. (By the way, wenn Sie einen link zu Ihrem Konto, Sie müssen 100 rep association bonus und wird in der Lage sein zu kommentieren.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der neuesten GNU Awk (seit 4.1.0 veröffentlicht), hat es die Möglichkeit,"inplace" - Datei Bearbeiten:
Beispiel:
Halten der Sicherung:
inplace
ist eigentlich eine Bibliothek mitgawk
nach iiSeymour Antwort, soinplace
ist etwas, das aufgenommen werden kann alsincludefile
., Es sei denn, Sie haben GNU awk, PHP 4.1.0 oder höher...
Werden Sie nicht haben, eine solche option als sed -
-i
option, so dass Sie stattdessen tun:Hinweis: die
-i
ist keine Magie, es ist auch die Erstellung einer temporären Dateised
nur handhabt es für Sie.Wie der GNU awk 4.1.0...
GNU awk
Hinzugefügt, diese Funktionalität in der version 4.1.0 (veröffentlicht am 10/05/2013). Es ist nicht so straight nach vorne wie nur geben die-i
option, wie beschrieben in der veröffentlichten Noten:Müssen Sie verwenden Sie das mitgelieferte
inplace.awk
include-Datei aufrufen, die Erweiterung richtig so:Die variable
INPLACE_SUFFIX
können verwendet werden, um geben Sie die Erweiterung für einen backup-Datei:Ich bin glücklich, diese Funktion wurde Hinzugefügt, jedoch hat mir die Umsetzung nicht sehr awkish wie kommt der Strom von der Prägnanz der Sprache und die
-i inplace
8 Zeichen lang ist zu lang ich.m.o.Hier ist ein link zu der Handbuch für das offizielle Wort.
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
?@sudo_O hat das Recht Antwort.
Das kann nicht funktionieren:
Die shell führt die Umleitungen vor übergabe Kontrolle über someprocess (Umleitungen). Die
>
Umleitung wird die Datei kürzen auf die Größe null (die Umleitung der Ausgabe). Daher wird durch die Zeit someprocess wird gestartet und möchte aus der Datei Lesen, es gibt keine Daten vor, es zu Lesen.Alternative ist die Verwendung
sponge
:Wo Sie ersetzen
'{print $0}'
durch Ihre awk-Skript undyour_file
durch den Namen der Datei, die Sie Bearbeiten wollen, im Ort.sponge
absorbiert vollständig die Eingabe vor dem speichern auf die Datei.sponge
ist Teilmoreutils
. So wird es nicht vorhanden sein, wird standardmäßig in die meisten Systeme. Aber sieht aus wie mindestenssponge
selbst ist portabel genug und ausgeführt werden kann fast überall.tee
-basiert ist, dasssponge
wird alles gelesen zu rammen, bevor aufschreiben, damit frieren Sie auf große Dateien.nur ein kleiner hack, der funktioniert
folgenden wird nicht funktionieren
sollte diese Arbeit
Mit tee
den
tee
Befehl stattfinden und ausgeführt, nachdem derawk
Befehl beendet ist aufgrund der|
.In Fall, dass Sie ein awk-Lösung, ohne eine temporäre Datei und eine brauchbare version!=(gawk 4.1.0):