grep, чтобы найти слова со всеми гласными

Используя grep -E и регулярные выражения, мне нужно найти слова, содержащие всю группу символов в определенном порядке. Например, слово, содержащее все гласные (aeiou), однако гласные могут появляться в слове в любом порядке.

  • Использование номеров в файле A для получения уникального идентификатора из файла B на основе порядка, указанного в файле A
  • grep и напечатать, сколько раз мой шаблон в файле 1 присутствует в файле2
  • Проверка скрипта выполняется
  • Как удалить все вхождения списка слов из текстового файла?
  • Искать только в текстовых файлах, которые не являются исходным кодом
  • Как восстановить файл tar, где stderr был смешан с stdout?
  • 'ls -1': список имен файлов без расширения
  • Помощь с регулярным выражением в grep
  • 3 Solutions collect form web for “grep, чтобы найти слова со всеми гласными”

    Это правило «содержит все aeiou в некотором порядке» не может быть выражено в расширенном регулярном выражении POSIX ( grep -E ) разумного размера.

    Вот большой, который перечисляет все 120 перестановок aeiou в качестве альтернатив:

     a.*e.*i.*o.*u|a.*e.*i.*u.*o|a.*e.*o.*i.*u|a.*e.*o.*u.*i|a.*e.*u.*i.*o|a.*e.*u.*o.*i|a.*i.*e.*o.*u|a.*i.*e.*u.*o|a.*i.*o.*e.*u|a.*i.*o.*u.*e|a.*i.*u.*e.*o|a.*i.*u.*o.*e|a.*o.*e.*i.*u|a.*o.*e.*u.*i|a.*o.*i.*e.*u|a.*o.*i.*u.*e|a.*o.*u.*e.*i|a.*o.*u.*i.*e|a.*u.*e.*i.*o|a.*u.*e.*o.*i|a.*u.*i.*e.*o|a.*u.*i.*o.*e|a.*u.*o.*e.*i|a.*u.*o.*i.*e|e.*a.*i.*o.*u|e.*a.*i.*u.*o|e.*a.*o.*i.*u|e.*a.*o.*u.*i|e.*a.*u.*i.*o|e.*a.*u.*o.*i|e.*i.*a.*o.*u|e.*i.*a.*u.*o|e.*i.*o.*a.*u|e.*i.*o.*u.*a|e.*i.*u.*a.*o|e.*i.*u.*o.*a|e.*o.*a.*i.*u|e.*o.*a.*u.*i|e.*o.*i.*a.*u|e.*o.*i.*u.*a|e.*o.*u.*a.*i|e.*o.*u.*i.*a|e.*u.*a.*i.*o|e.*u.*a.*o.*i|e.*u.*i.*a.*o|e.*u.*i.*o.*a|e.*u.*o.*a.*i|e.*u.*o.*i.*a|i.*a.*e.*o.*u|i.*a.*e.*u.*o|i.*a.*o.*e.*u|i.*a.*o.*u.*e|i.*a.*u.*e.*o|i.*a.*u.*o.*e|i.*e.*a.*o.*u|i.*e.*a.*u.*o|i.*e.*o.*a.*u|i.*e.*o.*u.*a|i.*e.*u.*a.*o|i.*e.*u.*o.*a|i.*o.*a.*e.*u|i.*o.*a.*u.*e|i.*o.*e.*a.*u|i.*o.*e.*u.*a|i.*o.*u.*a.*e|i.*o.*u.*e.*a|i.*u.*a.*e.*o|i.*u.*a.*o.*e|i.*u.*e.*a.*o|i.*u.*e.*o.*a|i.*u.*o.*a.*e|i.*u.*o.*e.*a|o.*a.*e.*i.*u|o.*a.*e.*u.*i|o.*a.*i.*e.*u|o.*a.*i.*u.*e|o.*a.*u.*e.*i|o.*a.*u.*i.*e|o.*e.*a.*i.*u|o.*e.*a.*u.*i|o.*e.*i.*a.*u|o.*e.*i.*u.*a|o.*e.*u.*a.*i|o.*e.*u.*i.*a|o.*i.*a.*e.*u|o.*i.*a.*u.*e|o.*i.*e.*a.*u|o.*i.*e.*u.*a|o.*i.*u.*a.*e|o.*i.*u.*e.*a|o.*u.*a.*e.*i|o.*u.*a.*i.*e|o.*u.*e.*a.*i|o.*u.*e.*i.*a|o.*u.*i.*a.*e|o.*u.*i.*e.*a|u.*a.*e.*i.*o|u.*a.*e.*o.*i|u.*a.*i.*e.*o|u.*a.*i.*o.*e|u.*a.*o.*e.*i|u.*a.*o.*i.*e|u.*e.*a.*i.*o|u.*e.*a.*o.*i|u.*e.*i.*a.*o|u.*e.*i.*o.*a|u.*e.*o.*a.*i|u.*e.*o.*i.*a|u.*i.*a.*e.*o|u.*i.*a.*o.*e|u.*i.*e.*a.*o|u.*i.*e.*o.*a|u.*i.*o.*a.*e|u.*i.*o.*e.*a|u.*o.*a.*e.*i|u.*o.*a.*i.*e|u.*o.*e.*a.*i|u.*o.*e.*i.*a|u.*o.*i.*a.*e|u.*o.*i.*e.*a 

    и вот тот, который короче, но сложнее следовать из-за гнездования:

     a.*(e.*(i.*[ou]|o.*[iu]|u.*[io])|i.*(e.*[ou]|o.*[eu]|u.*[eo])|o.*(e.*[iu]|i.*[eu]|u.*[ei])|u.*(e.*[io]|i.*[eo]|o.*[ei]))|e.*(a.*(i.*[ou]|o.*[iu]|u.*[io])|i.*(a.*[ou]|o.*[au]|u.*[ao])|o.*(a.*[iu]|i.*[au]|u.*[ai])|u.*(a.*[io]|i.*[ao]|o.*[ai]))|i.*(a.*(e.*[ou]|o.*[eu]|u.*[eo])|e.*(a.*[ou]|o.*[au]|u.*[ao])|o.*(a.*[eu]|e.*[au]|u.*[ae])|u.*(a.*[eo]|e.*[ao]|o.*[ae]))|o.*(a.*(e.*[iu]|i.*[eu]|u.*[ei])|e.*(a.*[iu]|i.*[au]|u.*[ai])|i.*(a.*[eu]|e.*[au]|u.*[ae])|u.*(a.*[ei]|e.*[ai]|i.*[ae]))|u.*(a.*(e.*[io]|i.*[eo]|o.*[ei])|e.*(a.*[io]|i.*[ao]|o.*[ai])|i.*(a.*[eo]|e.*[ao]|o.*[ae])|o.*(a.*[ei]|e.*[ai]|i.*[ae])) 

    Оба они предполагают, что слова, которые вы ищете, находятся в файле с одним словом в строке. Если нет, вам придется изменить все . 'to [^ ] чтобы соответствовать символам без пробела. (Примечание: \S из perl доступно во многих двигателях regexp, возможно, включая grep, который вы используете, но регулярные выражения, совместимые с perl, не являются стандартной функцией grep, поэтому [^ ] она должна быть.)

    Я бы не попытался написать ни одно из этих регулярных выражений вручную. Я использовал генератор перестановок для первого, и сделал много макросъемки и воспроизведения в vim, чтобы записать второй.

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

    (С этого момента я придерживаюсь предположения о одном слове на строку ввода).

    Слово, в котором отсутствуют совпадения ^[^a]*$ (от начала до конца, сделано из символов, отличных от a ).

    Слово, в котором отсутствуют совпадения e ^[^e]*$
    Слово, которое отсутствует, соответствует i ^[^i]*$
    Слово, в котором отсутствуют совпадения o ^[^o]*$
    Слово, в котором отсутствуют совпадения u ^[^u]*$

    Слово, в котором отсутствует OR, отсутствующий или отсутствует или отсутствует или нет совпадений u

     ^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$ 

    Итак, эта команда grep дает вам все слова, которые вы не хотите:

     grep -E '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' wordlist 

    и удобная опция -v дает вам слова, которые вы хотите:

     grep -vE '^([^a]*|[^e]*|[^i]*|[^o]*|[^u]*)$' wordlist 

    При необходимости добавьте -i .

    Техника инверсии – это то, что нужно помнить при написании регулярных выражений. Иногда действительно сложное регулярное выражение является обратным к более простому.

    Нужно ли быть одной командой grep ? Чтобы найти все слова, содержащие каждую гласную, по крайней мере один раз (в любом порядке), самая простая команда

      grep a word_list |  grep e |  grep i |  grep o |  grep u 

    Добавьте -i если вам нужно быть нечувствительным к регистру.

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

    Например, вы можете использовать подстановочный оператор для сопоставления строк, где у них есть свой шаблон, но он будет соответствовать только ему, если он находится в том же порядке, что и ваш шаблон.

    Пример файла

     $ cat words.txt aeiou a1e2i3o4u5 dog blh spkz uoiea 

    1. Пример использования. *

     $ grep -E ".*a.*e.*i.*o.*u.*" words.txt aeiou a1e2i3o4u5 

    Это соответствует только строкам, которые имеют последовательность aeiou в той же прогрессии. Но он не соответствует uoiea .

    2. Пример использования [aeiou]

     $ grep -E [aeiou] words.txt aeiou a1e2i3o4u5 dog uoiea 

    Этот подход подходит, но он слишком свободен, сопоставляя все, что содержит по крайней мере 1 из букв в нашем шаблоне.

    3. Пример использования нескольких графов

     $ grep a words.txt | grep e | grep i | grep o | grep u aeiou a1e2i3o4u5 uoiea 

    Если вы вынуждены использовать grep , это действительно единственный вариант, который вам доступен, если вы намерены сопоставить все символы в наборе.

    4. Пример использования awk

     $ awk '/a/ && /e/ && /i/ && /o/ && /u/ { print }' words.txt aeiou a1e2i3o4u5 uoiea 

    Как будто часто случается дело с Unix. Если вы захотите переключиться на соответствующий инструмент, то, казалось бы, невозможная задача станет легкой. Здесь, перейдя на awk мы можем теперь использовать фактический оператор AND ( && ), и теперь мы можем указать, какой набор символов мы хотим найти.

    5. Пример использования других переключателей grep , (-w)

    Если строки, на которые вы согласны, гарантированы единственными словами, вы можете использовать ключ -w .

      -w, --word-regexp Select only those lines containing matches that form whole words. The test is that the matching substring must either be at the beginning of the line, or preceded by a non-word constituent character. Similarly, it must be either at the end of the line or followed by a non-word constituent character. Word-constituent characters are letters, digits, and the underscore. 

    Так как серия букв из набора [aeiou] все смежна, вы можете использовать этот переключатель так:

     $ grep -Ew "*[aeiou]*" words.txt aeiou uoiea 

    Но если вам приходится иметь дело с многофакторными фразами, то это тоже провалит вас:

     $ echo "I love Fort Lauderdale" | grep -Ew "*[aeiou]*" $ 

    Однако, если мы используем ключ -i так, чтобы регистр grep нечувствителен, то он снова будет работать:

     $ echo "I love Fort Lauderdale" | grep -Ewi "*[aeiou]*" I love Fort Lauderdale 
    Interesting Posts

    Заменить неизвестную строку с помощью sed в сценарии bash

    Что происходит на каждом этапе процесса создания ядра Linux?

    Какая среда и учетные данные используются при запуске, фоновом и сервисном процессах

    Как перенести настройки ulimit в macOS?

    Как сделать уведомления для горячего подключения съемных носителей временными

    Могу ли я ограничить размер кеша linux?

    Просмотреть заблокированный адрес от sshguard

    Centos 6.5 от настольного компьютера до базового сервера

    Маршрутизация портов / DNS для отдельной программы

    Как я могу подключить эти два компьютера, используя eth1394 / firewire-net, автоматически?

    Fedora 16 не загружается

    Как обновить календарь Google в Gnome?

    Синтаксис определения псевдонима bash

    Получить список подкаталогов, содержащих файл, соответствующий строке

    Предотвратите пробуждение оптического дисковода (с шумом) после приостановки и при запуске

    Linux и Unix - лучшая ОС в мире.