Так как этот вопрос является лучшим результатом в поисковых системах, вот строчка из https://serverfault.com/a/547331, которая использует подоболочку вместо sponge
(которая часто не является частью ванильной установки, как OS X) :
echo "$(grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name)" > file_name
Или общий случай:
echo "$(cat file_name)" > file_name
Тест от https://askubuntu.com/a/752451:
printf "hello\nworld\n" > file_uniquely_named.txt && for ((i=0; i<1000; i++)); do echo "$(cat file_uniquely_named.txt)" > file_uniquely_named.txt; done; cat file_uniquely_named.txt; rm file_uniquely_named.txt
Следует напечатать:
hello
world
Принимая во внимание вызов cat file_uniquely_named.txt > file_uniquely_named.txt
в текущей оболочке:
printf "hello\nworld\n" > file_uniquely_named.txt && for ((i=0; i<1000; i++)); do cat file_uniquely_named.txt > file_uniquely_named.txt; done; cat file_uniquely_named.txt; rm file_uniquely_named.txt
Печатает пустую строку.
Я не проверял это на больших файлах (возможно, более 2 или 4 ГБ).
Я позаимствовал этот ответ у Харта Симхи и kos .