Geben Sie den Dateiinhalt ein, leiten Sie einige Aktionen weiter und setzen Sie das Ergebnis zurück

1

Gibt es eine Möglichkeit, wie folgt vorzugehen:

cat somefile.txt | sort | uniq > somefile.txt

Das heißt, ich möchte die gesamte Datei auflisten, dann einige Aktionen an ihren Inhalt leiten und das Ergebnis schließlich wieder in die Quelldatei zurücksetzen, um sie vollständig zu überschreiben. Im Moment mache ich das, indem ich die Ausgabe in eine temporäre Datei lege und sie schließlich über das Original verschiebe. Ich möchte es so einfach machen, wie es Linux Piping erlaubt.

Shell ist bashin Linux und cmdin Windows, wenn es wichtig ist.

Alex GP
quelle

Antworten:

2

(Beantwortet Bash)
Nein. Die Shell verarbeitet zuerst Umleitungen und schneidet dann die Datei ab. Erst dann catstartet und es wird mit einer leeren Datei gearbeitet.

spongeDas moreutilsPaket enthält ein Tool, mit dem Sie Folgendes ausführen können:

cat somefile.txt | sort | uniq | sponge somefile.txt

Dieser Befehl kann vereinfacht werden ( UUOC entfernen ):

sort -u somefile.txt | sponge somefile.txt

Ohne dass spongeSie in eine temporäre Datei schreiben müssen und wenn der Befehl erfolgreich ist, überschreiben Sie die Eingabedatei

tmpfile=$(mktemp)
sort -u somefile.txt > "$tmpfile" && mv "$tmpfile" somefile.txt
Glenn Jackman
quelle
1
spongeist die allgemeine Antwort, aber da sort(im Gegensatz zu den meisten Dienstprogrammen) alle Daten gepuffert werden müssen, bevor sie ausgegeben werden (mit Ausnahme von -m), können Sie dies stattdessen für diesen speziellen Fall tun sort -u -o somefile.txt somefile.txt.
Dave_thompson_085
0

Sie können Vim im Ex-Modus verwenden:

ex -sc 'sort u|x' somefile.txt
  1. sort u sortiere einzigartig

  2. x speichern und schließen

Steven Penny
quelle