Невозможно делать то, что вы хотите с 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. Тем не менее, он передает содержимое в новый файл, а затем переименовывает файл, так что это не то, что вы хотите.