Не можна робити те, що ти хочеш sed. Навіть версії, sedякі підтримують -iможливість редагування файлу на місці, роблять саме те, що ви чітко заявили, що не хочете: вони записують у тимчасовий файл, а потім перейменують файл. Але, можливо, можна просто скористатися ed. Наприклад, щоб змінити всі входження fooв barв файлі file.txt, ви можете зробити:
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
Синтаксис схожий на sed, але точно не зовсім однаковий.
Але, можливо, варто подумати, чому ви не хочете використовувати перейменований тимчасовий файл. Навіть якщо у вас немає -iпідтримки sed, ви можете легко написати сценарій, щоб зробити роботу за вас. Замість цього sed -i 's/foo/bar/g' fileви могли б зробити inline file sed 's/foo/bar/g'. Такий сценарій банально писати. Наприклад:
#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "$@" >$tmp && cat $tmp > $IN # preserve hard links
має бути адекватним для більшості застосувань
-iє варіантом у gnu sed, але не є у стандартній sed. Однак він передає вміст у новий файл, а потім перейменовує файл, щоб він не був тим, що потрібно.