Попередження: це небезпечний метод! Він зловживає буферами вводу-виводу в 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