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