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

385
Alex G.P.

Gibt es eine Möglichkeit, so etwas zu tun:

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

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

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

1

2 Antworten auf die Frage

2
glenn jackman

(Antwort auf Bash)
Nein. Die Shell verarbeitet zuerst Umleitungen, die die Datei dann abschneiden. Erst dann wird catgestartet und es wird mit einer leeren Datei gearbeitet.

spongeDas moreutilsPaket enthält ein Werkzeug, mit dem Sie Folgendes tun 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 müssen spongeSie in eine temporäre Datei schreiben, und wenn der Befehl erfolgreich ist, überschreiben Sie die Eingabedatei

tmpfile=$(mktemp) sort -u somefile.txt > "$tmpfile" && mv "$tmpfile" somefile.txt 
"Schwamm" ist die allgemeine Antwort, aber da "sort" (im Gegensatz zu den meisten Dienstprogrammen) alle Daten vor der Ausgabe von Daten zwischenspeichern muss (mit Ausnahme von "-m"), können Sie für diesen speziellen Fall stattdessen -u -o somefile sortieren .txt somefile.txt`. dave_thompson_085 vor 8 Jahren 1
0
Steven Penny

Sie können Vim im Ex-Modus verwenden:

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

  2. x speichern und schließen