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

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

  • Grep список для слова, которое существует в строке, и игнорировать все другие строки, которые содержат это слово
  • Подсчет количества строк, имеющих число больше 100
  • Grep один вкладыш для удаления блоков случайного текста
  • Поиск последнего элемента в строке с использованием grep
  • Подстановка на месте для строк, соответствующих некоторому шаблону в заданном наборе файлов
  • Как выбрать последнее число в строке в сценарии bash
  • gnuwin bash Если файл .txt содержит строковый файл-копию
  • Есть ли альтернатива grep -A -B -C-переключателям (для печати нескольких строк до и после)?
  • 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

    Как использовать аппаратный узел OpenVZ 7 для кеширования имен с помощью типов * all * контейнеров?

    Самый практичный способ сравнения контрольных сумм md5

    Драйвер графической подсистемы Intel для Linux Mint 17

    Восстановить исходную конфигурацию для каждого пакета в системе

    Как получить список имен общих библиотек в Linux?

    Обновление заголовка терминала в ловушке отладки ломает расцветку

    Есть ли способ сказать системе сохранить папку в памяти?

    Какие сетевые протоколы используют сервер баз данных Postgres?

    Как поговорить с geoclue через его интерфейс dbus?

    FreeBSD: Как установить Django с mod_wsgi?

    Могу ли я создать новую вкладку терминала Gnome, не оставив символическую ссылку на каталог?

    Лучшие варианты установки жесткого диска Mac OS X на моем Linux-боксе?

    Есть ли ограничение по размеру для команды compress?

    Linux – время изменения файла и время модификации

    Сенсорный экран ELAN на Ubuntu 14.04 и Debian 7.6

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