Encontrar palavras com características específicas em um arquivo de dicionário

Encontrar palavras com características específicas em um arquivo de dicionário

Pesquise palavras que começam be terminam com oe contêm um iou gem 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 é grepe 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 único iou g.
  • Todos os outros caracteres ( be o) 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 -we -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 greppode fazer. Estou descartando -oaqui 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 -wopção e fazer

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' palavras
boo djhg
biografiajdjjf
dgdhdbgo
ahhh

Tivemos que adicionar a -Eopção porque |é uma expressão regular estendida. A \bcorrespondência será feita em qualquer limite do Word.

Responder2

Eu usaria greppara fazer isso:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^bcomece com "b"
  • .*qualquer coisa a qualquer momento
  • (i|g)*"i" ou "g" uma ou mais vezes
  • o$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 $we, 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.

informação relacionada