Предупреждение: это опасный метод! Он использует буферы ввода / вывода в linux и с определенными параметрами буферизации ему удается работать с небольшими файлами. Это интересное любопытство. Но не используйте это для реальной ситуации!
Кроме -i
того, sed
вы можете использовать tee
утилиту .
От man
:
tee - чтение из стандартного ввода и запись в стандартный вывод и файлы
Итак, решение будет таким:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html
- здесь tee
повторяется, чтобы убедиться, что конвейер буферизован. Затем все команды в конвейере блокируются, пока они не получат некоторый ввод для работы. Каждая команда в конвейере запускается, когда вышестоящие команды записывают 1 буфер байтов (размер где-то определен ) на вход команды. Таким образом, последняя команда tee index.html
, которая открывает файл для записи и, следовательно, очищает его, выполняется после завершения восходящего конвейера и вывода в буфер внутри конвейера.
Скорее всего, следующее не будет работать:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html
- он будет запускать обе команды конвейера одновременно без какой-либо блокировки. (Без блокировки трубопровода должны пройти байты построчно вместо буфера буфера. То же, что при запуске cat | sed s/bar/GGG/
. Без блокировки это более интерактивные и , как правило трубопроводы всего 2 команд работают без буферизации и блокировки. Более длинные трубопроводы буферные.) В tee index.html
воле откройте файл для записи, и он будет очищен. Однако, если вы включите буферизацию всегда, вторая версия тоже будет работать.
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html