Ich bin gerade gelaufen
cat /opt/webapplications/Word/readme.log | grep -v 'Apple'
und ich bekam die Ausgabe auf dem Cli, die ich erwartet hatte, das waren alle Zeilen readme.log
, die nicht ' Apple
' enthielten ...
Als nächstes rannte ich ...
cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log
Ist /opt/webapplications/Word/readme.log
jedoch leer.
Kann mir jemand erklären, warum dies passiert ist oder wie ich das hätte tun sollen?
Antworten:
Dies geschah, weil als erstes
>
die Datei erstellt werden muss, in die geschrieben werden soll. Wenn die Datei bereits vorhanden ist, wird ihr Inhalt gelöscht. (Außerdem müssen Siecat
Ihre Anweisung überhaupt nicht verwenden, da siegrep
nicht nur mit STDIN, sondern auch mit Dateien funktioniert.)Der richtige Weg, dies zu tun, besteht darin, eine temporäre Datei zum Lesen oder Schreiben zu verwenden. Also entweder
oder
würde funktionieren.
quelle
Wenn Sie in dieselbe Datei umleiten (
>
), kann die Shell die Datei erstellen / abschneiden, bevor dercat
Befehl aufgerufen und die Eingabe gelesen wird (siehe: Warum funktioniert „Datei1 sortieren> Datei1“ nicht? ). Wenn Sie die Datei filtern möchten, ist es besser, die Ausgabe in eine andere Datei umzuleiten oder eine Umleitung zu vermeiden, zum Beispiel:Der bessere und sicherere Weg ist die Verwendung von In-Place-Editoren, die für diese Art von Vorgängen ausgelegt sind, z
oder verwenden
ex
(Teil von Vim):Verbunden:
quelle