Для sed 's/cat/dog/'
или любой другой подстановки, не меняющей размер файла, с любой Bourne-подобной оболочкой можно сделать:
sed 's/cat/dog/' < file 1<> file
Малоизвестный, но более чем 35-летний¹ стандартный оператор - открыть файл в режиме чтения+записи без усечения. По сути, это заставляет
sed
записывать свой вывод поверх своего ввода. Важно убедиться, что вывод не перезаписывает части файла, которые sed
еще не прочитал.
Для замен, которые приводят к уменьшению размера файла, с ksh93
:
sed 's/hippopotamus/ant/' < file 1<>; file
;
, расширение ksh93
- это то же самое, что , за исключением того, что если перенаправляемая команда успешна, файл усекается в том месте, где команда завершилась.
Или с perl:
perl -pe 's/hippopotamus/ant/;
END{truncate STDOUT, tell STDOUT}' < file 1<> file
Для всего остального просто используйте стандартную форму:
cp -i file file.back &&
sed 's/dog/horse/g' < file.back > file # && rm -f file.back
¹ Хотя первоначальная реализация в оболочке Bourne и ранних версиях оболочки Korn была фактически сломана, исправлена в конце 80-х. А оболочка Almquist изначально не поддерживала его.