Есть ли способ поместить следующую логику в команду grep? - PullRequest
0 голосов
/ 12 сентября 2011

Например, предположим, у меня есть следующий фрагмент данных

ABC,3,4
,,ExtraInfo
,,MoreInfo
XYZ,6,7
,,XyzInfo
,,MoreXyz
ABC,1,2
,,ABCInfo
,,MoreABC

Получить grep для извлечения строк ABC тривиально. Однако, если я хочу также захватить следующие строки, чтобы произвести этот вывод

ABC,3,4
,,ExtraInfo
,,MoreInfo
ABC,1,2
,,ABCInfo
,,MoreABC

Можно ли это сделать с помощью grep и стандартных сценариев оболочки?

Редактировать: просто чтобы уточнить, что между ними может быть переменное количество строк. Логика будет заключаться в том, чтобы продолжать печать, пока первый столбец CSV пуст.

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

grep -A 2 {Your regex} выведет две строки, следующие за найденными строками.

Обновление: Поскольку вы указали, что это может быть любое количество строк, это будет невозможно, поскольку фокусы grepпри сопоставлении в одной строке см. следующие вопросы:

2 голосов
/ 12 сентября 2011

Вы можете использовать это, хотя немного хакерство из-за grep в конце конвейера, чтобы отключить все, что не начинается с 'A' или ',':

$ sed -n '/^ABC/,/^[^,]/p' yourfile.txt| grep -v '^[^A,]'

Редактировать:Менее хакерский способ - использовать awk:

$ awk '/^ABC/ { want = 1 } !/^ABC/ && !/^,/ { want = 0 } { if (want) print }' f.txt

. Вы можете понять, что он делает, если прочитаете вслух шаблон и вещь в фигурных скобках.

1 голос
/ 12 сентября 2011

На странице руководства есть пояснения для опций, которые вы хотите посмотреть в -A в разделе Контроль строки контекста .

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