Найти слова, содержащие 20 гласных grep - PullRequest
0 голосов
/ 12 февраля 2019

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

Первоначально я думал, что grep -Ei [aeiou] {20} сделает это, но кажется, что он ищет только 20 гласных в строке

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

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

grep -Ei "[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*\ 
[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*[aeiou][b-df-hj-np-tv-z]*" 

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

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

grep -Ei "([aeiou][b-df-hj-np-tv-z]*){20}"
0 голосов
/ 12 февраля 2019

Если все, что вам действительно нужно, это найти 20 гласных в строке, то это просто:

awk '{x=tolower($0)} gsub(/[aeiou]/,"&",x)==20' file

или с помощью grep:

grep -Ei '^[^aeiou]*([aeiou][^aeiou]*){20}$' file

Чтобы найти слова (при условии, что каждый пробелотдельно) есть много опций, включая GNU awk:

awk -v RS='\\s+' -v IGNORECASE=1 'gsub(/[aeiou]/,"&")==20' file

или любой другой awk:

awk '{for (i=1;i<=NF;i++) {x=tolower($i); if (gsub(/[aeiou]/,"&",x)==20) print $i} }' file
0 голосов
/ 12 февраля 2019

Я не верю, что это проблема, которая требует просто регулярных выражений.Вот программный подход.Мы переопределяем разделитель полей на пустую строку;каждый символ - это поле.Итерируем по строке;если символ гласный, мы увеличиваем счетчик.Если в конце строки количество равно 20, мы печатаем его:

cat nicks.awk
BEGIN{
  FS=""
}
{
  c=0;
  for( i=1;i<=NF;i=i+1 ){ 
    if ($i ~ /[aeiou]/ ){
      c=c+1; 
    }
  };
  if(c==20){
    print $0
  }
}

И это то, что он делает ... он печатает только одну строку с 20 гласными.

echo "contributorNickSequestionsfoundcontainingvowelsgrcep" |  awk -f nicks.awk
echo "contributorNickSeoquestionsfoundcontainingvowelsgrcep" |  awk -f nicks.awk 
contributorNickSeoquestionsfoundcontainingvowelsgrcep
echo "contributorNickSaeoquestionsfoundcontainingvowelsgrcep" |  awk -f nicks.awk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...