# Understanding an egrep expression

I stumbled across the following egrep expression:

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

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]`

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]*\$' \
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.

• 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
• 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. Dec 5, 2013 at 15:42