Pesquise palavras que começam b
e terminam com o
e contêm um i
ou g
em um arquivo de texto.
Um comando deve ser digitado no terminal exibindo uma palavra que tenha as especificações descritas acima.
Eu usei o seguinte, mas não para em uma palavra e contém espaços em branco:
~$ egrep -n '\bb.*(i|g).*o\b'
Estou usando Linux Ubuntu e não tenho certeza de como fazer a declaração. Eu tentei várias instruções, todas falharam. Alguém pode me ajudar a desvendar a instrução regex, visto que estou lutando para fazer isso?
Um exemplo: digamos que eu tenha as seguintes palavras aleatórias em um arquivo de texto:
boo djhg
bio jdjjf
dgdhd bgo
ghhh
Então as palavras 'boo', 'bio' e 'bgo' precisam ser destacadas.
Responder1
O comando que você está procurando é grep
e a expressão regular desejada é 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 si mesmos.
O uso de [[:alnum::]]*
em vez de .*
evita palavras correspondentes que contenham espaços.
grep
é usado como
grep OPTIONS 'EXPRESSION' INPUT-FILES
e produzirá as linhas correspondentes EXPRESSION
à sua saída padrão (o terminal, neste caso).
Nesse caso, você desejaria usar as opções -w
e -o
, que forçam a expressão a corresponder palavras (sequências de caracteres cercadas por caracteres que não são palavras) e a retornar apenas os dados correspondentes (não a linha inteira).
$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo
Você mencionou que queriadestaqueas palavras combinadas. Isso é algo que o GNU grep
pode fazer. Estou descartando -o
aqui a opção de obter a linha completa de cada partida, caso contrário você obterá apenas o mesmo resultado de antes, mas destacado, o que seria chato.
$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' palavras biografiajdjjf dgdhdbgo
Como você pode ver, isso mostra apenas as correspondências nas linhas que contêm correspondências. Para ver a entrada completa (mesmo linhas sem correspondência), com as correspondências destacadas, temos que descartar a -w
opção e fazer
$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' palavras boo djhg biografiajdjjf dgdhdbgo ahhh
Tivemos que adicionar a -E
opção porque |
é uma expressão regular estendida. A \b
correspondência será feita em qualquer limite do Word.
Responder2
Eu usaria grep
para fazer isso:
egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
^b
comece com "b".*
qualquer coisa a qualquer momento(i|g)*
"i" ou "g" uma ou mais vezeso$
termine com "o"
Responder3
set -f; for w in `cat /usr/share/dict/words`; do
case $w in b*[ig]*o ) echo "$w" ;; esac
done
# you could as well say: $(< /usr/share/dict/words) in place of the backquoted cat.
# if your version of bash supports it.
Estamos dividindo o arquivo de palavras em palavras $w
e, em seguida, fazendo uma verificação curinga nele.
- O padrão curinga é: b*[ig]*o que deve ser lido como:
- $w deve começar com a letra "b".
- $w deve terminar com a letra "o".
- $w deve conter um "i" ou um "g" em algum lugar entre eles para que corresponda
- Após uma correspondência bem-sucedida, exibimos a palavra.