A melhor maneira de fazer isso é lembrar como os arquivos funcionam no unix - o arquivo existe, desde que haja um link para o arquivo (diretório ou processo que abre o arquivo).
Portanto, abra o arquivo, exclua essa entrada de diretório e execute o processo que grava em uma nova entrada de diretório com o mesmo nome, mas vinculada a um inode diferente.
Por último, o bom disso é que ele funciona para qualquer tipo de operação de pipeline, não apenas para as coisas que podem fazer o hack do buffer de arquivo temporário.
{ rm file ; sed -e s/this/that/g > file ; } < file
Uma palavra de advertência - isso pode causar um desastre se você precisar que sua reescrita seja uma operação atômica. O unix não oferece maneiras limpas de bloquear arquivos, especialmente no nível do shell. Isso era um problema na idade das trevas se você estivesse fazendo algo como editar um arquivo de senha em um sistema ocupado que estava rodando algo como o NIS. Sempre que mais de um processo estiver lendo / gravando em um arquivo, tenha muito cuidado se o seu sistema estiver ocupado ou importante.
As únicas operações que são 100% certas de serem atômicas são as manipulações de entrada de diretório - rm / ln / mv (no mesmo sistema de arquivos).
Então agora as coisas ficam mais longas e feias ..
A parte de matemática disto requer uma concha posix ou concha bourne similarmente estendida
c=0
while
f=$SECONDS
test -f file.$c.tmp
do
c=$(($c+1))
done
grep stuff < file > file.$c.tmp && mv file.$c.tmp file