Поиск слов с определенными характеристиками в файле словаря

Поиск слов с определенными характеристиками в файле словаря

Найдите слова, которые начинаются bи заканчиваются на oи содержат символ iили gв текстовом файле.

В терминале необходимо ввести команду, отображающую слово, имеющее характеристики, описанные выше.

Я использовал следующий вариант, но он не ограничивается одним словом и содержит пробелы:

~$  egrep -n '\bb.*(i|g).*o\b'

Я использую Linux Ubuntu и не уверен, как сделать оператор. Я пробовал несколько инструкций, все безуспешно. Может ли кто-нибудь помочь мне распутать оператор regex, учитывая, что я с трудом это делаю?

Пример: предположим, у меня есть следующие случайные слова в текстовом файле:

boo djhg
bio jdjjf
dgdhd bgo
ghhh

Затем необходимо выделить слова «boo», «bio» и «bgo».

решение1

Команда, которую вы ищете, — grep, а регулярное выражение, которое вам нужно, — b[[:alnum:]]*[ig][[:alnum:]]*o.

  • [[:alnum:]]будет соответствовать одному буквенно-цифровому символу.
  • *будет соответствовать любому числу (включая ноль) предыдущего выражения.
  • [ig]будет соответствовать одному iили g.
  • Все остальные символы ( bи o) в этом регулярном выражении соответствуют самим себе.

Использование [[:alnum::]]*вместо .*позволяет избежать сопоставления слов, содержащих пробелы.

grepиспользуется как

grep OPTIONS 'EXPRESSION' INPUT-FILES

и выведет строки, соответствующие EXPRESSIONего стандартному выводу (в данном случае терминалу).

В этом случае вам следует использовать параметры -wи -o, которые заставляют выражение сопоставлять слова (строки символов, окруженные несловесными символами) и возвращать только сопоставленные данные (а не всю строку).

$ grep -w -o 'b[[:alnum:]]*[ig][[:alnum:]]*o' words
bio
bgo

Вы упомянули, что хотели бывыделятьсовпавшие слова. Это то, что grepможет сделать GNU. Я опускаю -oздесь опцию, чтобы получить всю строку каждого совпадения, иначе вы просто получите тот же результат, что и раньше, но подсвеченный, что было бы скучно.

$ grep --color -w 'b[[:alnum:]]*[ig][[:alnum:]]*o' слов
биоjdjjf
дгдхдбго

Как вы можете видеть, это показывает только совпадения в строках, которые содержат совпадения. Чтобы увидеть полный ввод (даже строки без совпадений), с выделенными совпадениями, мы должны убрать опцию -wи сделать

$ grep --color -E '\bb[[:alnum:]]*[ig][[:alnum:]]*o\b|$' слов
бу djhg
биоjdjjf
дгдхдбго
гххх

Нам пришлось добавить -Eопцию, поскольку |это расширенное регулярное выражение. \bБудет соответствовать любой границе слова.

решение2

Я бы использовал grepдля этого:

egrep -i "^b.*(i|g)+.*o$" /usr/share/dict/words
  • ^bначать с "б"
  • .*что угодно в любое время
  • (i|g)*«i» или «g» один или несколько раз
  • o$заканчивается на "о"

решение3

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.

Мы разбиваем файл слов на слова $w, а затем выполняем проверку по шаблону.

  • Шаблон подстановочных знаков: b*[ig]*o, что следует читать как:
  • $w должно начинаться с буквы «b».
  • $w должен заканчиваться буквой «о».
  • $w должен содержать либо «i», либо «g» где-то между ними, чтобы совпало
  • При успешном совпадении мы отображаем слово.

Связанный контент