O GNU grep tem a opção -P
para as expressões regulares no estilo perl e a opção -o
para imprimir apenas o que corresponde ao padrão. Eles podem ser combinados usando asserções de look-around (descritas em Extended Patterns no perlre manpage ) para remover parte do padrão grep do que é determinado que corresponde aos propósitos de -o
.
$ grep -oP 'foobar \K\w+' test.txt
bash
happy
$
O \K
é a forma abreviada (e mais eficiente) de (?<=pattern)
que você usa como uma asserção de look-behind de largura zero antes do texto que deseja gerar. (?=pattern)
pode ser usado como uma asserção de antecipação de largura zero após o texto que você deseja gerar.
Por exemplo, se você quisesse combinar a palavra entre foo
e bar
, você poderia usar:
$ grep -oP 'foo \K\w+(?= bar)' test.txt
ou (por simetria)
$ grep -oP '(?<=foo )\w+(?= bar)' test.txt