Помимо Perl, общий и удобный подход к многострочному редактированию для потоков (и файлов тоже):
Сначала создайте какой-нибудь новый УНИКАЛЬНЫЙ разделитель строк, как вам нравится, например
$ S=__ABC__ # simple
$ S=__$RANDOM$RANDOM$RANDOM__ # better
$ S=$(openssl rand -hex 16) # ultimate
Затем в вашей команде sed (или любой другой инструмент) вы заменяете \n на ${S}, например
$ cat file.txt | awk 1 ORS=$S | sed -e "s/a test${S}Please do not/not a test\nBe/" | awk 1 RS=$S > file_new.txt
( awk заменяет разделитель строк ASCII вашим и наоборот.)
[[ -t 0 ]]
просто определяет, открыт ли fd0 на (псевдо-)терминале. Поскольку fd0 является стандартным вводом, обычно это так.
«Надежный» метод терпит неудачу, потому что «эта оболочка» — это оболочка, в которой выполняется сценарий, которая не является интерактивной, а не оболочка, из которой вы запустили сценарий.
Проверка того, является ли стандартный ввод терминалом ([[ -t 0 ]]
), несколько более надежна, но она по-прежнему не определяет, запущен ли скрипт изcron
:есть способы запустить скрипт таким образом, чтобы [[ -t 0 ]]
завершился успешно, даже если он не запускается из терминала.
Принятый ответ на Проверить, запускается ли скрипт с помощью cron, а не вручную , кажется мне более надежным.