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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow