Bin ich blind oder gibt es keine Möglichkeit --in-place
dafür sort
?
Um die Ergebnisse in der Eingabedatei zu speichern, verwendet sed -i
( --in-place
).
Ausgabe von sort
in die Eingabedatei umleiten
sort < f > f
führt dazu, dass es leer wird. Wenn es keine --in-place
Option gibt - gibt es vielleicht einen Trick, wie man das auf praktische Weise macht?
(Das einzige, was mir in den Sinn kommt:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Das Verschieben ist nicht die richtige Wahl, da die Dateiberechtigungen möglicherweise geändert werden. Deshalb überschreibe ich mit dem Inhalt der temporären Datei, die ich dann entferne.)
text-processing
sort
Grzegorz Wierzowiecki
quelle
quelle
insitu
Möglichkeit, beliebige Befehle direkt zu verwenden.sort
.Antworten:
sort
hat die-o, --output
Option, dass ein Dateiname als Argument verwendet wird. Wenn es mit der Eingabedatei identisch ist, wird das Ergebnis in eine temporäre Datei geschrieben und anschließend die ursprüngliche Eingabedatei überschrieben (genau das Gleiche wie bei der Eingabesed -i
).Von
GNU sort
Infoseite:und aus der Open Group Base-Spezifikation, Ausgabe 7 :
quelle
man sort
- ist es ein undokumentiertes Feature? Ist es Standard und tragbar?sort -o <filename> <filename>
Sortiert eine Datei sicher an Ort und Stelle.Sie können die
sponge
Funktion verwenden, die zuerst die Daten aufnimmtstdin
und sie dann in eine Datei schreibt, wie zum Beispiel:Der Nachteil
sponge
ist, dass die Ausgabe temporär im Speicher abgelegt wird, was bei großen Dateien problematisch sein kann. Andernfalls müssen Sie es zuerst in eine Datei schreiben und dann die Originaldatei überschreiben.Wie jedoch aus anderen Antworten hervorgeht, sind Vor-Ort-Änderungen im Allgemeinen keine gute Idee, da
sponge
die Maschine während eines Prozesses (zum Beispiel des einen) abstürzen kann und Sie dann sowohl die ursprüngliche als auch die neue Datei verlieren können. Sie sollten es zuerst in eine andere Datei schreiben und dann eine atomaremv
(Verschiebungs-) Anweisung verwenden.quelle
Es ist gefährlich, die Eingabedatei mit der Ausgabedatei zu überschreiben, da Sie beide verloren haben, wenn das Programm oder das System abstürzt, während die Datei geschrieben wird.
Einige Programme (meistens GNU-Versionen) haben eine In-Place-Option (z. B.
-i
für Perl und GNU sed;-o
für GNU sort). Sie arbeiten, indem sie die Daten in eine temporäre Datei einfügen und an ihren Platz verschieben. Für Programme , die keine solche Option, haben Colin Watson -sponge
Dienstprogramm (im Joey Hess moreutils ) macht den Job sicher für jedes Programm (Beispiele: Kann ichcut
? Eine Datei im Ort ändern ; Wie kann ich iconv die Eingabedatei mit dem konvertierten ersetzen machen Ausgabe? ).Nur in den seltenen Fällen, in denen Sie die Originaldatei nicht mit denselben Berechtigungen neu erstellen können, empfehle ich, die Datei an Ort und Stelle zu überschreiben. In diesem Fall sollten Sie die ursprüngliche Eingabe lieber irgendwo speichern. Und dann können Sie einfach die Kopie der Eingabe verarbeiten und in die Originaldatei senden.
quelle
sort -o
ist nicht GNU-spezifisch und wurde speziell entwickelt, um die Datei an Ort und Stelle zu ändern.sort
kann nicht mit dem Schreiben der Ausgabe beginnen, bevor die Eingaben nicht vollständig gelesen wurden (verwendet Speicher oder temporäre Dateien zum Speichern von Daten), daher sollte es ganz natürlich möglich sein, die Eingabe zu überschreiben.sort
nicht POSIX ist, dasort -mo file1 file1 file2
es nicht garantiert funktioniert, während herkömmlichesort
Anwender wissen, wie man das umgeht (bereits in Unix V7 in den 70er Jahren).sort -o
funktioniert bei mir mit coreutils 8.25 und die Eigenschaft ist im Handbuch dokumentiert (wobei zu beachten ist, dass dies nur beim Sortieren und nicht beim Zusammenführen der Fall ist). Wenn Sie dies reproduzieren können, senden Sie einen Fehlerbericht (unter Angabe der genauen Befehlszeile, der genauen Eingabedatei (en), auf welchem System Sie es ausführen und wie Sie die Binärdatei erhalten haben).Benutze
-o
oder probiere die vim-Methode:quelle