Ausführen von Fedora 25 Server Edition. sed --version
gibt mir sed (GNU sed) 4.2.2
zusammen mit den üblichen Copyright und Kontaktinformationen. Ich habe eine Textdatei sudo vi ./potential_sed_bug
erstellt. Vi zeigt den Inhalt dieser Datei (mit :set list
aktiviert) als:Warum löscht "sed -n -i" vorhandene Dateiinhalte?
don't$
delete$
me$
please$
ich dann führen Sie den folgenden Befehl ein:
sudo sed -n -i.bak /please/a\testing ./potential_sed_bug
Bevor wir diskutieren die Ergebnisse; hier ist das, was die sed man page sagt:
-n, --quiet, --silent Raum automatisches Drucken von Musterunterdrücken
und
-i [SUFFIX], - -in-place [= SUFFIX] Dateien an Ort und Stelle bearbeiten (macht Backup, wenn Erweiterung geliefert wird). Der Standardbetriebsmodus besteht darin, symbolische und harte Verbindungen zu unterbrechen. Dies kann mit --follow-symlinks und --copy geändert werden.
Ich habe auch other sed command references geschaut zu lernen, wie mit sed anhängen. Basierend auf meinem Verständnis aus der Forschung, die ich gemacht habe; der resultierende Datei-Inhalt sein sollte:
don't
delete
me
please
testing
Allerdings läuft sudo cat ./potential_sed_bug
gibt mir die folgende Ausgabe:
testing
Im Lichte dieser Diskrepanz ist mein Verständnis des Befehls, den ich falsch lief, oder gibt es ein Fehler mit sed/der Umgebung?
@AMemberofDollars: Die kurze davon: die Reihenfolge der Verarbeitung nicht ändert, und ja, wird die temporäre Datei zuerst geschrieben und erst nach Abschluss macht es das Original ersetzen - meinen Update finden Sie unter. – mklement0
@stevesliva: Ich sehe, danke. Ich habe die Antwort entsprechend aktualisiert. – mklement0
Was mich interessiert ist, dass ich immer 'sed -e cmd1 | sed -e cmd2' entspricht "sed -e cmd1 -e cmd2", aber dies ist ein Bereich, in dem Sie sed tatsächlich nach sed einfügen möchten, wenn Sie aus irgendeinem Grund einen Kontext hinzufügen, den Sie später ändern möchten. Ich denke, 'n' und' q' andere Befehle würden diese Äquivalenz ebenfalls brechen. – stevesliva