Jika Anda ingin yang setara sed -i.bak
, itu sangat sederhana.
Pertimbangkan skrip ini untuk 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"
Kami cukup mengganti baris yang ditandai dengan
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
Ini memindahkan file yang ada menjadi cadangan, dan menulis file baru.
Jika kita ingin yang setara
sed -i -e "$script" "$dir" # no backup
maka itu sedikit lebih kompleks. Kita dapat membuka file untuk dibaca sebagai input standar, kemudian memutuskan tautannya, sebelum mengarahkan output sed untuk menggantinya:
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
Kami melakukan ini dalam sub-shell, sehingga stdin asli kami masih tersedia setelah ini. Dimungkinkan untuk beralih input dan beralih kembali tanpa subshell, tetapi cara ini tampaknya lebih jelas bagi saya.
Perhatikan bahwa kami berhati-hati untuk menyalin terlebih dahulu, daripada membuat foo
file baru - ini penting jika file tersebut diketahui oleh lebih dari satu nama (yaitu memiliki tautan keras) dan Anda ingin memastikan bahwa Anda tidak memutus tautan tersebut .
/usr/gnu/bin/sed
untuk mendapatkan -i dukungan.