İstediğinizi yapmak mümkün değildir sed
. Bunun sürümleri bile sed
, -i
bir dosyayı yerinde düzenleme seçeneğini tam olarak istemediğinizi tam olarak belirttiğiniz şeyi destekler: geçici bir dosyaya yazıp dosyayı yeniden adlandırırlar. Ama belki de kullanabilirsiniz ed
. Örneğin , dosyadaki tüm oluşumlarını değiştirmek foo
için şunları yapabilirsiniz:bar
file.txt
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
Sözdizimi benzerdir sed
, ancak kesinlikle aynı değildir.
Ancak, neden yeniden adlandırılmış geçici bir dosya kullanmak istemediğinizi düşünmelisiniz. Eğer bir bilgisi yoksa bile -i
destekleyen sed
, kolayca sizin için işi yapmak için bir komut dosyası yazabilirsiniz. Bunun yerine, sed -i 's/foo/bar/g' file
yapabilirsin inline file sed 's/foo/bar/g'
. Böyle bir senaryo yazmak önemsizdir. Örneğin:
#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "$@" >$tmp && cat $tmp > $IN # preserve hard links
çoğu kullanım için yeterli olmalıdır.
-i
gnu sed'de bir seçenektir, ancak standart sed'de değildir. Ancak, içeriği yeni bir dosyaya aktarır ve sonra dosyayı istediğiniz şekilde yeniden adlandırır.