Eşdeğerini istiyorsanız, sed -i.bak
oldukça basit.
GNU sed için şu komut dosyasını düşünün:
#!/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"
İşaretli çizgiyi basitçe
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
Bu, varolan dosyayı yedek olarak taşır ve yeni bir dosya yazar.
Eğer eşdeğerini istiyorsak
sed -i -e "$script" "$dir" # no backup
o zaman biraz daha karmaşıktır. Sed'in çıkışını değiştirmek için yönlendirmeden önce dosyayı standart girdi olarak okumak için açabilir, ardından bağlantısını kaldırabiliriz:
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
Bunu bir alt kabukta yapıyoruz, böylece orijinal stdinimiz bundan sonra hala kullanılabilir. Girişleri değiştirmek ve alt kabuk olmadan geri dönmek mümkündür, ancak bu benim için daha net görünüyor.
Yeni bir foo
dosya oluşturmak yerine önce kopyalamaya dikkat ettiğimizi unutmayın - dosya birden fazla adla biliniyorsa (yani sabit bağlantıları varsa) ve bağlantıları koparmadığınızdan emin olmak istiyorsanız bu önemlidir. .
/usr/gnu/bin/sed
-i desteği almak için kullanın .