Как напечатать диапазон строк с помощью sed, кроме той, которая соответствует шаблону диапазона конца? - PullRequest
2 голосов
/ 28 апреля 2011

Интересно, существует ли sed -продолжительный способ печати диапазона строк, определяемого сопоставляемыми шаблонами, кроме одной последней строки, соответствующей конечному шаблону.

Рассмотрим следующий пример.У меня есть файл

line  1
line  2
line  3
ABC line  4
+ line  5
+ line  6
+ line  7
line  8
line  9
line 10
line 11
line 12

Я хочу получить все, начиная с ABC (включая) и все строки, начинающиеся с +:

ABC line  4
+ line  5
+ line  6
+ line  7

Я попробовал его с

sed -n '/ABC/I,/^[^+]/ p' file

но это дает слишком много на одну строку:

ABC line  4
+ line  5
+ line  6
+ line  7
line  8

Какой самый простой способ (sed -только) оставить эту последнюю строку?

Ответы [ 4 ]

5 голосов
/ 28 апреля 2011

Могли бы быть и лучшие способы, но я мог бы придумать этот вкладыш sed 1:

sed -rn '/ABC/,/^[^+]/{/(ABC|^\+)/!d;p;}' file

Еще один вкладыш sed 1 -

sed -n '/ABC/,/^[^+]/{x;/^$/!p;}' file

Еще один вкладыш sed 1 (и, возможно,лучше)

sed -n '/ABC/I{h;:A;$!n;/^+/{H;$!bA};g;p;}' file
2 голосов
/ 18 марта 2012

Это может работать для вас:

 sed '/^ABC/{:a;n;/^\(ABC\|+\)/ba};d' file

РЕДАКТИРОВАТЬ: разрешить смежные ABC секции.

2 голосов
/ 28 апреля 2011

Самый простой способ (я узнаю что-то новое, если кто-нибудь сможет решить это одним вызовом sed), это добавить дополнительный sed в конце, т.е.

sed -n '/ABC/I,/^[^+]/ p' file | sed '$d'
ABC line  4
+ line  5
+ line  6
+ line  7

Обман, я знаю, но в этом и заключается красота философии Unix pipe. Продолжайте записывать свои данные, пока не получите то, что хотите; -)

Надеюсь, это поможет.

0 голосов
/ 29 апреля 2011

Ну, вы выбрали свой ответ.Но почему вы не используете /^(ABC|\+)/?Или я неправильно понимаю ваше требование?

Если вы хотите найти эти + строки ПОСЛЕ поиска по алфавиту

awk '/ABC/{f=1;print} f &&/^\+/ { print }' file

Это гораздо проще понять, чем создавать загадочные sed выражения.Когда ABC найден, установите флаг.Когда строки, начинающиеся с +, найдены и установлен флаг, выведите строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...