Versuchen Sie, Schwamm von moreutils wie folgt zu verwenden:
sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd
Es sammelt die gesamte Eingabe, bevor es in seine Ausgabe schreibt.
Ich würde vermuten, dass sed immer noch die temporäre Datei erstellt, aber das Folgende könnte tun, was Sie wollen? (Die Verwendung von strace zeigt Ihnen möglicherweise an, ob sed eine temporäre Datei erstellt oder nicht).
sed -i '/bar/!d' foo.txt
Das Ausrufezeichen invertiert die Übereinstimmung, d steht für Löschen, also werden alle Zeilen entfernt, die keinen Balken enthalten.