1

I stumbled across the following egrep expression:

egrep '^([^aieou]*[aieou]){5,7}[^aieou]*$' /usr/share/dict/words

on this page: http://matt.might.net/articles/sculpting-text

The expression is supposed to find the words that contain between 5 and 7 vowels.

I understand the first ^ meaning from the beginning of the line and the second ^ to negate any of the aieou followed by any number of characters and one of the aeiou between 5 and 7 times. But I did not get how the first and last expressions: [^aieou]

1 Answer 1

1

It looks for zero or more consonants ([^aieou]*) followed by 5 to 7 vowels (([aieou]){5,7}) followed by zero or more consonants ([^aieou]*). The entire regular expression is anchored to the beginning of the line (^) and the ending, ($).

Example

$ egrep '^([^aieou]*[aieou]){5,7}[^aieou]*$' \
        /usr/share/dict/words | head -10
abacinate
abacination
abacterial
abaisance
abalation
abalienate
abalienated
abalienating
abalienation
abandonable

Details

So when it matches say this first word, abacinate, the first letter a has 0 consonants to the left, so we match that part.

As additional vowels with either zero or more consonants are found on the left and/or right, we match those situations too. If we find 5 to 7 of them, then we match.

2
  • Thanks. In addition to the ^ pattern, I was also confused by the vowel a in result. The fact that * means zero or more clarifies it. Dec 4, 2013 at 21:19
  • 1
    Slightly different interpretation - it looks for the pattern of zero or more consonants followed by a single vowel with the pattern repeating 5 to 7 times. The repeated pattern is anchored to the beginning of the line and to the pattern zero or more consonants followed by end-of-line.
    – doneal24
    Dec 5, 2013 at 15:42

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .