Essayez d'utiliser une éponge de moreutils comme celle-ci :
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Il collecte toute l'entrée avant d'écrire dans sa sortie.
Je suppose que sed pourrait toujours créer le fichier temporaire, mais ce qui suit pourrait faire ce que vous voulez? (L'utilisation de strace sur cela peut vous montrer si sed crée un fichier temporaire ou non).
sed -i '/bar/!d' foo.txt
L'exclamation inverse la correspondance, d est pour supprimer, donc cela supprime toutes les lignes qui n'ont pas de barre.