Wenn Sie das Äquivalent von wollen sed -i.bak
, ist es ziemlich einfach.
Betrachten Sie dieses Skript für GNU sed:
#!/bin/sh
# Create an input file to demonstrate
trap 'rm -r "$dir"' EXIT
dir=$(mktemp -d)
grep -v '[[:upper:][:punct:]]' /usr/share/dict/words | head >"$dir/foo"
# sed program - removes 'aardvark' and 'aardvarks'
script='/aard/d'
##########
# What we want to do
sed -i.bak -e "$script" "$dir"
##########
# Prove that it worked
ls "$dir"
cat "$dir/foo"
Wir können einfach die markierte Linie durch ersetzen
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
Dadurch wird die vorhandene Datei als Backup verschoben und eine neue Datei geschrieben.
Wenn wir das Äquivalent von wollen
sed -i -e "$script" "$dir" # no backup
dann ist es etwas komplexer. Wir können die Datei zum Lesen als Standardeingabe öffnen und dann die Verknüpfung aufheben, bevor wir die Ausgabe von sed anweisen, sie zu ersetzen:
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
Wir machen das in einer Sub-Shell, so dass unser ursprünglicher Standard danach noch verfügbar ist. Es ist möglich, Eingänge zu schalten und ohne Unterschale zurückzuschalten, aber dieser Weg scheint mir klarer zu sein.
Beachten Sie, dass wir zuerst sorgfältig kopieren, anstatt eine neue foo
Datei zu erstellen. Dies ist wichtig, wenn die Datei unter mehr als einem Namen bekannt ist (dh über feste Links verfügt) und Sie sicherstellen möchten, dass Sie die Links nicht unterbrechen .
/usr/gnu/bin/sed
-i, um Unterstützung zu erhalten.