LINUX.ORG.RU

sed подскажите патерн

 


1

2

Всем привет!
На вход текст:
header 1
hello
world
header 2
so far
so good
header 1
green
peace
header 2
las vegas
На выходе нужно получить:
header 1header 2
header 1header 2
...
У меня получилось но при использовании пайпов вот так:
$ cat test.txt | sed -ne '/\(header\ 1\|header\ 2\)/p' | sed -e '/header\ 1/{;N;s/\n//}'
Подскажите пожалуйста как сделать это в одном вызове

Одним выражением получается достаточно длинная конструкция, к тому же не понятно, как именно должна обрабатываться нестандарная последовательность, допустим два ″header 1″ подряд или ″header 1″ в конце файла. Поэтому лучше вам конструировать выражение самому, чтобы понимать как оно работает.

Так, нужно заносить ″header 1″ в ″hold space″ (команда h), а при ″header 2″ печатать и hold и pattern, использовать метки и ветвление по команде ″t″. Но, там всякие нюансы, типа отсутствия ″header 2″ в конце файла — отдельная обработка в sed-скрипте последней строки файла, чтобы распечатать hold space.

mky ★★★★★
()
Ответ на: комментарий от mky

Ясно, еще есть вариант выделить блоки '/header\ 1/,/header\ 2/{}'
и потом из этих блоков сджойнить первую и последние строки в одну и выводить.
Да, еще на счет hold space непонятно:
Согласно ману h/H = копирование/добавление соответственно, пытался сделать '/(header\ 1\|header\ 2\)/H', то есть при нахождении заголовков с номерами 1 или 2 добавить строку в hold space, но тут подозреваю еще нужно условие при достижении конца строки вывести этот буфер(хотя-бы просто пока вывести) , но у меня какая-то белебирда получается, наверное целесообразнее в моем случае использовать метки.

domik_v_derevne
() автор топика
Ответ на: комментарий от domik_v_derevne

Ну вот вам такое решение:

sed -n -e '/header 1/h' -e '/header 2/{H;x;s/\n//;p}'

hold space напрямую вывести нельзя, только обменять его с pattern space и вывести pattern space.

Или вот такое:

sed -n -e '/\(header\ 1\|header\ 2\)/H' -e '${x;s/^\n//;s/\(header\ 1\)\n/\1/g;p}'

mky ★★★★★
()
Ответ на: комментарий от mky

mky Благодарю за примеры!
Ну вобщем я хотел как во втором примере, а первый немного обескуражил, но немного погодя дошло что команда '/header 1/h' копирует из buffer space в hold space с затиранием.

domik_v_derevne
() автор топика
$ echo "header 1
hello
world
header 2
so far
so good
header 1
green
peace
header 2
las vegas" | sed -n '/header 1/{h;b};/header 2/{H;g;s/\n//p}'
emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.