Как получить содержимое подгруппы, сопоставленное регулярным выражением

#regex #shell #grep

Вопрос:

вот так: p.txt

 abc-111-zzz-022-ffff
abc-222-zzz-033-ffff
abc-333-zzz-044-ffff
 

Я могу получить полное совпадение ( $0 в регулярном выражении):

 [root@ser user]# grep -Po 'abc-([0-9] )-zzz-([0-9] )' p.txt
abc-111-zzz-022
abc-222-zzz-033
abc-333-zzz-044
 

Как я могу получить только содержимое подгрупп $1$2 , например :

 111022
222033
333044
 

Спасибо!

Комментарии:

1. Я совершенно уверен, что вам нужно будет выполнить grep дважды, по одному разу для каждой группы захвата, используя lookahead и lookbehinds (или используйте что-то другое, кроме grep).

Ответ №1:

grep не позволяет печатать группы захвата. Воспользуйся sed :

 sed -E 's/abc-([0-9] )-zzz-([0-9] ).*/12/' file

111022
222033
333044
 

В качестве альтернативы, если у вас есть pcregrep , используйте эту команду для печати первых 2 групп захвата:

 pcregrep -o1 -o2 'abc-([0-9] )-zzz-([0-9] )' file

111022
222033
333044