sed
Bearbeitung vor Ort
Suche…
Syntax
- sed -I extension - FreeBSD sed (fortlaufender Zeilenzähler)
- sed -I [ Erweiterung ] - NetBSD und Illumos sed (fortlaufender Zeilenzähler)
- sed -i Erweiterung - FreeBSD sed
- sed -i [ Erweiterung ] - NetBSD, OpenBSD, Illumos, BusyBox und GNU sed
- sed --in-place [= extension ] - Illumos, BusyBox und GNU sed
Parameter
Parameter | Einzelheiten |
---|---|
extension | Speichern Sie eine Sicherungsdatei mit der angegebenen Erweiterung oder keine Sicherungsdatei, wenn die extension eine Zeichenfolge der Länge Null ist. |
Bemerkungen
In-Place-Editing ist eine verbreitete, aber nicht standardmäßige Erweiterung, die in den meisten neueren Systemen vorhanden ist.
Aus einem BSD- sed
Handbuch
(Ein Abschnitt wie dieser erscheint in allen aktuellen BSD- sed
Handbüchern und in ihren Derivaten.)
Es wird nicht empfohlen, bei der Bearbeitung von Dateien eine Längenverlängerung von 0 zu wählen, da dies in Situationen, in denen der Speicherplatz erschöpft ist, zu Beschädigungen oder zu teilweisem Inhalt führen kann.
Vergiss nicht den mächtigen ed
Es gibt definitiv eine Verwendung für sed
und für In-Place-Bearbeitungsfunktionen von sed
. Wenn jedoch der UNIX-Standard erweitert wird, sollten wir immer fragen, warum der alte UNIX-Standard diese Funktion nicht enthält. Obwohl UNIX nicht perfekt ist, wurde die Orthogonalität und Vollständigkeit der Tools so entwickelt, dass sie der Perfektion nahekommen, zumindest zu Zwecken, die um 1970 sichtbar waren: Textbearbeitung und automatisierte Textbearbeitung waren zu dieser Zeit sicherlich sichtbar.
Die Idee von sed
ist eigentlich nicht die Bearbeitung einer Datei , sondern die Bearbeitung eines Streams . Deshalb ist der Name sed
eine Kurzform des Stream-Editors . Nehmen Sie die s
weg, und Sie erhalten das Werkzeug, das eigentlich für die Dateibearbeitung entwickelt wurde : ed
:
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
oder cat file_edit_commands | ed file
.
Ersetzen Sie Strings direkt in einer Datei
sed -i s/"what to replace"/"with what to replace"/g $file
Wir verwenden -i
, um eine -i
Bearbeitung der $file
Datei auszuwählen. In einigen Systemen müssen Sie nach -i
das Suffix hinzufügen, um die ursprüngliche Datei zu sichern. Sie können eine leere Zeichenfolge wie -i ''
hinzufügen -i ''
um die Sicherungserstellung wegzulassen. Sehen Sie sich die Anmerkungen in diesem Thema über die Option -i
.
Die g
Terminatormittel führen in jeder Zeile ein globales Suchen / Ersetzen aus.
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
Tragbare Verwendung
In-Place-Bearbeitung ist zwar üblich, jedoch keine Standardfunktion. Eine praktikable Alternative wäre die Verwendung einer Zwischendatei, um entweder das Original oder die Ausgabe zu speichern.
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
Um die Option -i
sowohl mit der GNU- als auch der FreeBSD-Syntax zu verwenden, muss eine Erweiterung angegeben und an die Option -i
angehängt werden. Das Folgende wird von beiden akzeptiert und erzeugt zwei Dateien, die Originalversion unter file.orig
und die bearbeitete Version unter file
:
sed -i.orig 'sed commands' file
Sehen Sie sich ein grundlegendes Beispiel für eine file
:
$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file # the original file has changed its content
XX
two
three
$ cat file.orig # the original content is now in file.orig
one
two
three
Ein komplexeres Beispiel, bei dem jede Zeile durch die Zeilennummer ersetzt wird:
$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2
Warum ist eine Sicherungsdatei erforderlich?
Um die Bearbeitung vor Ort ohne Sicherungsdatei verwenden zu können, muss -i
ein Argument mit der Länge Null erhalten. Für FreeBSD sed
ein Argument für -i
erforderlich, entweder angehängt oder separat, während für die optionale Argumenterweiterung von GNU das Argument angehängt werden muss -i
. Beide unterstützen das Anhängen des Arguments an -i
, aber ohne dass es erforderlich ist -i'' command
-i extension
nicht unterschieden werden kann, kann ein Argument mit der Länge Null nicht an -i
angehängt werden.
Durch die direkte Bearbeitung ohne Angabe einer Sicherungsdatei werden schreibgeschützte Berechtigungen überschrieben
sed -i -e cmd file
ändert die file
selbst dann, wenn die Berechtigungen schreibgeschützt sind.
Dieser Befehl verhält sich ähnlich wie
sed -e cmd file > tmp; mv -f tmp file
eher, als
sed -e cmd file > tmp; cat tmp > file; rm tmp
Das folgende Beispiel verwendet gnu sed
:
$ echo 'Extremely important data' > input
$ chmod 400 input # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)
Dies kann durch Erstellen einer Sicherung durch Angeben eines SUFFIX
mit der Option i
SUFFIX
:
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data