Найдите слова, которые начинаются 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» где-то между ними, чтобы совпало
- При успешном совпадении мы отображаем слово.