Один из способов решения этой проблемы - дважды использовать grep
и передать один результат следующему.
Сначала мы найдем все слова длиной 9, как вы делали в предыдущем упражнении:
grep -Eo '\b\w{9}\b' countries
Я использую флаг o
, который перечисляет только совпадающие слова, печатая одно слово в строке.Далее мы используем Linux pipe (не регулярное выражение ИЛИ), чтобы передать выходные данные первого grep
второму grep
:
grep -Eo '\b\w{9}\b' countries | grep 'i'
Окончательный результат будет состоять из всех словс девятью символами и i
.
В зависимости от ваших требований, этот подход может считаться «обманом», если вы больше сосредоточены на Regex, но хорошим решением, если вы также изучаете Linux.
Тот факт, что вы ищете слова усложняет регулярное выражение (в отличие от строк в файле), но также возможно придумать одинрегулярное выражение, чтобы соответствовать этим словам.
\b(?=\w*i)\w{9}\b
Это основывается на \b\w{9}\b
у вас уже есть.(?=\w*i)
- это AND
условие.После того, как мы находим начало слова (\b
), мы смотрим вперед для \w*i
(ноль или более букв, а затем наш i
).Мы используем \w*
в прогнозе, а не .*
, поэтому мы смотрим на то же слово .(?=.*i)
соответствовало бы любому i
также после девяти символов.
После нахождения i
мы продолжаем проверять, что слово состоит только из 9 букв.
Рабочий пример: https://regex101.com/r/G5EVdM/1