Вы также можете использовать sed
$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT
Чтобы сделать изменение файла напрямую
$ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT
Чтобы сохранить исходный файл и перенаправить желаемый вывод на другой
$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT
Здесь вы видите буферизацию C stdio в действии. Он будет хранить выходные данные в буфере до тех пор, пока не будет достигнут определенный предел (, который может составлять 512 байт, 4 КБ или больше ), а затем отправить все сразу.
Эта буферизация отключается автоматически, если stdout подключен к терминалу, но когда он подключен к каналу (, например, в вашем случае ), он активирует такое поведение буферизации.
Обычный способ отключения/управления буферизацией — использование функции setvbuf()
(см. этот ответ для более подробной информации ), но это необходимо сделать в исходном коде jq
сам по себе, так что, возможно, для вас это не практично...
Есть обходной путь... (Можно сказать, хак. )Существует программа под названием "unbuffer", которая распространяется с "expect" и может создать псевдотерминал -и подключить его к программе. Таким образом, несмотря на то, что jq
по-прежнему будет записывать в канал, он будет думать, что записывается в терминал, и эффект буферизации будет отключен.
Установите пакет «expect», который должен поставляться с «unbuffer», если у вас его еще нет... Например, в Debian (или Ubuntu):
$ sudo apt-get install expect
Затем вы можете использовать эту команду:
$ tail -f in.txt | unbuffer -p jq '.f1' | tee out.txt
См. также этот ответ для более подробной информации о "unbuffer", и вы также можете найти справочную страницу здесь .