O comando que você está procurando é grep
, e a expressão regular que você deseja é b[[:alnum:]]*[ig][[:alnum:]]*o
.
-
[[:alnum:]]
corresponderá a um único caractere alfanumérico. -
*
corresponderá a qualquer número (incluindo zero) da expressão anterior. -
[ig]
corresponderá a um únicoi
oug
. - Todos os outros caracteres (
b
eo
) nesta expressão regular específica correspondem a eles próprios.
O uso de [[:alnum::]]*
em vez de .*
evita palavras correspondentes que contenham espaços.
grep
é usado como
grep OPTIONS 'EXPRESSION' INPUT-FILES
e emitirá as linhas correspondentes a EXPRESSION
para sua saída padrão (o terminal, neste caso).
Nesse caso, você desejaria usar as opções -w
e -o
, o que força a expressão a corresponder palavras (sequências de caracteres cercadas por caracteres não-palavra) e a retornar apenas os dados correspondentes (não o linha inteira).
$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo
Você mencionou que queria destacar as palavras correspondentes. Isso é algo que o GNU grep
pode fazer. Estou soltando a opção -o
aqui para obter toda a linha de cada partida, caso contrário, você apenas obterá o mesmo resultado de antes, mas destacado, o que seria entediante.
$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' words bio jdjjf dgdhd bgo
Como você pode ver, isso mostra apenas as correspondências nas linhas que contêm correspondências. Para ver a entrada completa (linhas pares sem correspondência), com as correspondências destacadas, temos que descartar a opção -w
e fazer
$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' words boo djhg bio jdjjf dgdhd bgo ghhh
Tivemos que adicionar a opção -E
, pois |
é uma expressão regular estendida. O \b
corresponderá a qualquer limite de palavra.