awk для захвата повторяющихся групп линий между двумя шаблонами - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть текстовый файл, как:

$ cat test.txt
one
two
--------------
three
four
--------------
five
six
--------------
seven
eight
--------------
nine
ten

Я пытаюсь использовать awk для захвата текста между двумя строками --------------.

Вывод, который я пытаюсь получить:

$ cat test.txt
three
four

seven
eight

Вот что у меня есть

awk '/^--------------$/{flag=1;next}/^--------------$/{flag=0}flag' test.txt
three
four
five
six
seven
eight
nine
ten

Ответы [ 3 ]

1 голос
/ 04 апреля 2019
$ awk -v RS='\n-+' '!(NR%2)' file

three
four

seven
eight

требуется поддержка нескольких символов RS (gawk). Он определяет разделитель записей, поэтому записи между разделителями. Здесь мы просим распечатать четные записи.

Или,

$ awk '/^-+$/{f=!f; if(f) print ""; next} f' file

three
four

seven
eight

это похоже на ваше решение, переворачивайте флаг при каждом появлении шаблона и печатайте, когда флаг установлен. Добавьте пустую строку перед разделением групп.

1 голос
/ 04 апреля 2019
$ awk '{x=sub(/^-+$/,"")} f; x{f=!f}' file
three
four

seven
eight

Функция sub () заменяет все строки --- пробелами и сохраняет тот факт, что в x она помнила, что текущая строка была --- строкой. x(f=!f} переключает f между 0 и 1 для каждой строки ---. f; печатает текущую строку, когда f имеет значение true, поскольку {print} является действием по умолчанию при наличии истинного условия.

0 голосов
/ 04 апреля 2019

Вы можете обмануть так:

sed 's/^-\{14\}//' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...