Не можна робити те, що ти хочеш 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. Однак він передає вміст у новий файл, а потім перейменовує файл, щоб він не був тим, що потрібно.