
Набор слов длиной 10 символов, содержащих подстроку из трех последовательных гласных. Пока что я пробовал эти команды.
grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt
grep -E '^.{10}$&a*.e*.i*.o*.u*' words2.txt
Входные данные, извлеченные с помощью OCRэтот скриншот:
unpernicious
unperspicuous
unpervious
unpious
unpiteous
unpiteously
unpiteousness
unplebeian
unplenteous
unportmanteaued
unportuous
unprecarious
unprecious
unprecocious
unpredacious
unpresumptuous
unpresumptuously
unpretentious
unpretentiously
unpretentiousness
unpromiscuous
unpropitious
unpropitiously
unpropitiousness
unpugnacious
unpunctilious
unquailed
unquailing
unquailingly
unqueen
unqueened
unqueening
unqueenlike
unqueenly
unquiescence
unquiescent
unquiescently
unquiet
unquietable
unquieted
unquieting
unquietly
unquietness
unquietude
unrapacious
unrebellious
unreligious
unreligiously
unreligiousness
unrighteous
unrighteously
unrighteousness
unsacrilegious
Unsagacious
unsalubrious
unsanctimonious
unsanctimoniously
unsanctimoniousness
unsanguineous
unsanguineously
unseditious
unseeable
unseeing
решение1
Вашу проблему (ИМХО) лучше решить с помощью awk
, но я просто укажу на проблему с вашей командой
grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt
Чтобы отфильтровать содержимое файла word2.txt
через оба grep
вызова, это должно выглядеть так:
grep -E '^.{10}$' words2.txt | grep 'a*.e*.i*.o*.u*'
Второй grep
шаблон должен быть таким [auoie]{3}
, что приводит нас к
grep -E '^.{10}$' words2.txt | grep -E '[aouie]{3}'
Вход для первого grep
— ваш файл. Вход для второго grep
— выход первого grep
,нетваш файл.
Используя POSIX awk
(например, последние версии GNU awk
):
$ awk 'length == 10 && /[aouei]{3}/' words2.txt
unpervious
unplebeian
unportuous
unprecious
unquailing
unqueening
unquieting
unquietude
mawk
, BSD awk
и исторические реализации до POSIX awk
не поддерживают {n}
регулярные выражения, какотметил Стефан Шазелас.
решение2
Вы правильно назвали 10 символов, но чтобы найти 3 гласные подряд, ищите группу [AEIOU]
:
egrep '^.{10}$' | egrep -i '[AEIOU]{3}'
Чтобы отклонить whitespace, используйте это:
egrep '^[^ \t]{10}$' | egrep -i '[AEIOu]{3}'
решение3
Если предположить, что это 1 слово/строка, то можно сделать следующее:
sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt
решение4
Со grep
встроенной поддержкой PCRE:
grep -iPx '(?=.*[aeiou]{3}.*).{10}'
Или:
grep -wiP '(?=\w*[aeiou]{3}\w*)\w{10}'
для поиска этих слов, когда они не находятся по одному в строке (добавьте, -o
если ваша grep
реализация поддерживает это, чтобы выводить только совпадающие слова, а не всю строку, в которой они найдены).словоозначает любую последовательностьсловосимволы (буквы (только латинского алфавита, без диакритических знаков, (*UCP)
для букв любого алфавита добавляйте a, хотя это все равно не будет охватывать гласные, такие как é
или α
), цифры и подчеркивание).