In der Frage wird nach Lösungen gefragt, die sed
Wenn das aber keine zwingende Voraussetzung ist, gibt es eine andere Möglichkeit, die vielleicht die bessere Wahl ist.
Die akzeptierte Antwort lautet sed -i
und beschreibt es als Ersetzen der Datei an Ort und Stelle, aber -i
tut das nicht wirklich und macht stattdessen das Äquivalent von sed pattern file > tmp; mv tmp file
, die Erhaltung des Eigentums und der Modalitäten. Dies ist unter vielen Umständen nicht ideal. Im Allgemeinen empfehle ich nicht die Ausführung von sed -i
nicht-interaktiv als Teil eines automatischen Prozesses - es ist, als würde man eine Bombe mit einer Lunte unbekannter Länge zünden. Früher oder später wird sie bei jemandem hochgehen.
Um eine Datei tatsächlich "an Ort und Stelle" zu bearbeiten und eine Zeile, die einem Muster entspricht, durch einen anderen Inhalt zu ersetzen, sollten Sie einen echten Texteditor verwenden. So wird es gemacht mit ed
, dem Standard-Texteditor.
printf '%s\n' '/TEXT_TO_BE_REPLACED/' d i 'This line is removed by the admin' . w q | \
ed -s /tmp/foo > /dev/null
Beachten Sie, dass dies nur die erste Das ist das, was die Frage impliziert hat und was gewünscht wurde. Dies ist ein wesentlicher Unterschied zu den meisten anderen Antworten.
Abgesehen von diesem Nachteil gibt es einige Vorteile bei der Verwendung von ed
über sed
:
- Sie können die Übereinstimmung ohne zusätzlichen Aufwand durch eine oder mehrere Zeilen ersetzen.
- Der Ersetzungstext kann beliebig komplex sein, ohne dass er durch ein Escaping geschützt werden muss.
- Am wichtigsten ist, dass die Originaldatei geöffnet, geändert und gespeichert wird. Eine Kopie wird nicht erstellt.
Wie es funktioniert
Wie es funktioniert:
- printf verwendet sein erstes Argument als Formatzeichenfolge und druckt jedes seiner anderen Argumente unter Verwendung dieses Formats, was bedeutet, dass jedes Argument von printf zu einer Ausgabezeile wird, die alle an
ed
auf stdin.
- Die erste Zeile ist eine Regex-Musterübereinstimmung, die ed dazu veranlasst, seine Vorstellung von "der aktuellen Zeile" auf die erste übereinstimmende Zeile zu verschieben (wenn es keine Übereinstimmung gibt, wird die aktuelle Zeile auf die letzte Zeile der Datei gesetzt).
- Die nächste ist die
d
Befehl, der anweist ed
um die gesamte aktuelle Zeile zu löschen.
- Danach kommt die
i
Befehl, der die ed
in den Einfügemodus;
- Danach werden alle nachfolgenden Zeilen in die aktuelle Zeile geschrieben (oder in zusätzliche Zeilen, wenn es eingebettete Zeilenumbrüche gibt). Das bedeutet, dass Sie eine Variable erweitern können (z.B.
"$foo"
), die mehrere Zeilen enthält, und es werden alle eingefügt.
- Der Einfügemodus endet, wenn
ed
sieht eine Linie bestehend aus .
- En
w
schreibt den Inhalt der Datei auf die Festplatte, und
- el
q
Befehl wird beendet.
- En
ed
wird der Befehl -s
und schaltet ihn in einen stillen Modus, so dass er während der Ausführung keine Informationen ausgibt,
- wird die zu bearbeitende Datei als Argument an
ed
,
- und schließlich wird stdout weggeworfen, um zu verhindern, dass die Zeile, die mit der Regex übereinstimmt, gedruckt wird.
Einige Unix-ähnliche Systeme werden (unpassenderweise) ohne eine ed
installiert, aber möglicherweise noch mit einer ex
Wenn dies der Fall ist, können Sie es einfach stattdessen verwenden. Wenn haben vim
aber keine ex
o ed
können Sie vim -e
stattdessen. Wenn Sie nur über Standard vi
aber keine ex
o ed
beschweren Sie sich bei Ihrem Sysadmin.