505 Stimmen

sed Datei an Ort und Stelle bearbeiten

Ich versuche herauszufinden, ob es möglich ist, eine Datei mit einem einzigen sed-Befehl zu bearbeiten, ohne manuell Streaming des bearbeiteten Inhalts in eine neue Datei und anschließende Umbenennung der neuen Datei in den ursprünglichen Dateinamen.

Ich habe die -i Option, aber mein Solaris-System sagte, dass -i ist eine illegale Option. Gibt es einen anderen Weg?

17voto

William Pursell Punkte 188248

Fassungen von sed die die -i für die Bearbeitung einer Datei an Ort und Stelle in eine temporäre Datei schreiben und die Datei dann umbenennen.

Alternativ können Sie auch einfach ed . Zum Beispiel, um alle Vorkommen von foo a bar in der Datei file.txt können Sie tun:

echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt

Die Syntax ist ähnlich wie bei sed , aber sicher nicht genau dasselbe.

Auch wenn Sie keine -i Unterstützung sed können Sie ganz einfach ein Skript schreiben, das die Arbeit für Sie erledigt. Anstelle von sed -i 's/foo/bar/g' file könnten Sie Folgendes tun inline file sed 's/foo/bar/g' . Ein solches Skript ist einfach zu schreiben. Zum Beispiel:

#!/bin/sh
IN=$1
shift
trap 'rm -f "$tmp"' 0
tmp=$( mktemp )
<"$IN" "$@" >"$tmp" && cat "$tmp" > "$IN"  # preserve hard links

sollte für die meisten Verwendungszwecke ausreichend sein.

16voto

mench Punkte 360

Sie könnten vi verwenden

vi -c '%s/foo/bar/g' my.txt -c 'wq'

10voto

Sergio A. Punkte 3666

sed unterstützt die Bearbeitung an Ort und Stelle. Von man sed :

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

    edit files in place (makes backup if extension supplied)

:

Angenommen, Sie haben eine Datei hello.txt mit dem Text:

hello world!

Wenn Sie eine Sicherungskopie der alten Datei aufbewahren möchten, verwenden Sie:

sed -i.bak 's/hello/bonjour' hello.txt

Sie erhalten dann zwei Dateien: hello.txt mit dem Inhalt:

bonjour world!

y hello.txt.bak mit dem alten Inhalt.

Wenn Sie keine Kopie behalten wollen, geben Sie einfach den Parameter extension nicht an.

5voto

fedorqui Punkte 249453

Wenn Sie die gleiche Anzahl von Zeichen ersetzen und nach sorgfältigem Lesen "In-place"-Bearbeitung von Dateien ...

Sie können auch den Umleitungsoperator verwenden <> um die Datei zum Lesen und Schreiben zu öffnen:

sed 's/foo/bar/g' file 1<> file

Sehen Sie es live:

$ cat file
hello
i am here                           # see "here"
$ sed 's/here/away/' file 1<> file  # Run the `sed` command
$ cat file
hello
i am away                           # this line is changed now

De Bash-Referenzhandbuch 3.6.10 Öffnen von Dateideskriptoren zum Lesen und Schreiben :

Der Umleitungsoperator

[n]<>word

bewirkt, dass die Datei, deren Name die Erweiterung von word ist, als sowohl zum Lesen als auch zum Schreiben auf Dateideskriptor n oder auf Dateideskriptor 0 wenn n nicht angegeben ist. Wenn die Datei nicht existiert, wird sie erstellt.

4voto

jlettvin Punkte 1081

Wie Moneypenny in Skyfall sagte: "Manchmal sind die alten Wege die besten." Kincade sagte später etwas Ähnliches.

$ printf ',s/false/true/g\nw\n' | ed {YourFileHere}

Fröhliche Bearbeitung an Ort und Stelle. Hinzugefügt ' \nw\n ', um die Datei zu schreiben. Entschuldigung für die Verzögerung bei der Beantwortung der Anfrage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X