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.

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.