Используйте sed
с опцией -z
, которая разделяет строки символами NUL, затем измените соответствие, как в:
sed -z 's/\nand/ and/g' infile
некоторые sed
реализации поддерживают настоящую новую строку, как вы можете сделать:
sed 's/
and/ and/g' infile
$ awk 'function p() { if (hold != "") print hold } /^and/ { hold = hold OFS $0; next } { p(); hold = $0 } END { p() }' file
tomato
ham and eggs
BLT
peanut butter and jelly sandwich
При этом используется awk
для накопления строк в переменной с именем hold
всякий раз, когда обнаруживается строка, начинающаяся со строки and
. Если текущая строка не начинается с and
, печатаются накопленные строки (, если они есть ), и текущая строка используется для сброса hold
.
Классический способ сделать это в sed (без чтения всего файла )будет:
sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file
Пр.
$ sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file
tomato
ham and eggs
BLT
peanut butter and jelly sandwich
См., например, Sed One -Объяснение вкладышей, часть I :Интервал между файлами, нумерация, преобразование и замена текста , 40. Добавить строку к предыдущей, если она начинается с знак равенства "="