Wie kann ich meinen sed-Befehl dazu bringen, dauerhafte Änderungen an einer Datei vorzunehmen?

32

Ist das möglich? Ich habe irgendwo gelesen, dass der folgende Befehl es tun würde:

sed -e [Befehl] [Datei]

aber es schien dasselbe zu tun wie nur

sed [Befehl] [Datei]

(Änderungen wurden nicht gespeichert). Gibt es eine Möglichkeit, dies mit sed zu tun?

John
quelle
2
Die -eFlagge steht für Ausdruck. Sie wollen wahrscheinlich die -iFlagge, was bedeutet, in-placeund ich empfehle Ihnen dringend, zu verwenden sed -i.bak 's/../' filename
Valentin Bajrami

Antworten:

50

Ich denke, Sie suchen nach -i:

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if SUFFIX supplied)

Beispielsweise:

$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld

Wenn Sie ein Suffix angeben, wird eine Sicherungsdatei erstellt:

$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt 
$ ls
foo.txt  foo.txt.bak

Die Eingabedatei wird geändert und eine Sicherungskopie mit den ursprünglichen Dateidaten erstellt.

Beachten Sie auch, dass dies für GNU ist sed, es gibt geringfügige Unterschiede im Format zwischen den verschiedenen sedImplementierungen.

terdon
quelle
4
Beachten Sie, dass die Manpage falsch ist. sedführt keine direkte Bearbeitung durch. Es erstellt eine neue Datei und überschreibt die alte, der Inode ändert sich.
Marco
2
@Marco So können Sie eine Datei sicher bearbeiten. "Bearbeiten einer Datei an Ort und Stelle" in der sed-Dokumentation bedeutet, dass die Originaldatei (wie durch ihren Namen definiert) und nicht die Originaldatei (wie durch ihren Inode definiert) geändert wird.
Gilles 'SO- hör auf böse zu sein'
2
@Gilles Ich bin vollkommen einverstanden , dass dies die bevorzugte Art und Weise ist eine Datei zu bearbeiten, aber ich würde es kaum nenne an Ort und Stelle . Das läuft aber auf die Frage hinaus, wie eine Datei identifiziert wird, nach Inode oder nach Name. Ich würde per inode sagen, sonst würden Konstrukte wie { rm file; cmd > file; } < filezu der Schlussfolgerung führen, dass cmd in dieselbe Datei liest und schreibt, was es nicht tut. Es sind zwei verschiedene Dateien, die zufällig den gleichen Namen haben. Aber ich möchte hier keine Diskussion anfangen.
Marco
Auf macOS 10.14 bekomme ich sed: 1: "foo.txt": invalid command code fbeim Laufen sed -i 's/o/X/g' foo.txt. Allerdings sed -i .bak 's/o/X/g' foo.txtfunktioniert das Bereitstellen einer Erweiterung, wie z. B.. Irgendwelche Ideen, wie man es zum Laufen bringt, ohne Sicherungsdateien zu erstellen?
Joshua Pinter
1
Okay, habe es herausgefunden. In macOS müssen Sie explizit einen leeren String für die Option extension param hinzufügen:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter
2

Diese Lösung funktioniert für HPUX (UNIX):

1 { rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh.:

2. perl -pi -e 's/Error/NO_Error/g' test1.sh

3. sed 's/Error/NO_Error/g' test1.sh | tee test1.sh

user3114790
quelle
Sie können nicht tee askubuntu.com/a/752451
Steven Penny
1

-eDiese Option dient zum Ausführen mehrerer sedBefehle

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

betrachten file.txtals

linux os

dann ist O / P

unix os

-i Option speichert Änderungen dauerhaft ...

user195318
quelle