Tips en Trucs 2019

Reguliere expressies: klassen, reeksen en hoeveelheden

Deze tip gaat verder waar we in de vorige tip over Reguliere expressies gestopt waren. Het eerste deel behandelde het zoeken in bestanden en mappen met behulp van reguliere expressies die gebruik maken van tekens, groepen en ankers. Vandaag gaan we verder met reguliere expressies die gebruik maken van klassen, reeksen en hoeveelheden.

Klassen/Reeksen

Een klasse (Class) bestaat uit een reeks tekens of een groep. Klassen worden tussen rechte haken geplaatst [].

Een reeks is een speciale groep met tekens in een klasse. Om bijvoorbeeld te zoeken naar een hoofdletter tussen A en L, gebruiken we de reeks [A-L].

Zoeken naar cijfers

Met de klasse en reeks [0-9] zoek je naar cijfers. Met de volgende opdracht zoek je in het bestand grephelp.txt naar cijfers:

dany@pindabook:~> grep '[0-9]' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er
een fout optreedt en '-q' is niet gegeven, dan is de afsluitwaarde 2.

Er werden vier regels met cijfers gevonden. Enkel de cijfers 0, 1 en 2 komen in het bestand grephelp.txt voor. Om enkel te zoeken naar de cijfers 0 en 1, gebruik je de opdracht:

dany@pindabook:~> grep '[0-1]' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er

Om juist niet naar cijfers te zoeken, laat je de reeks voorafgaan door een ^-teken. Om te zoeken naar -byte dat niet door een cijfers wordt voorafgegaan, gebruik je:

dany@pindabook:~> grep "[^0-9]-byte" grephelp.txt
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen

Laat je de negatie (^) weg dan krijg je het volgende resultaat:

dany@pindabook:~> grep "[0-9]-byte" grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam

Met klassen kan je eenvoudig hoofletterongevoelig zoeken. Om de opties -r en -R in het bestand grephelp.txt op te sporen, gebruik je:

dany@pindabook:~> grep "\-[rR]," grephelp.txt
  -r, --recursive           afdalen in submappen (ofwel '--directories=recurse')
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen

Let daarbij op de backslash. Deze wordt gebruikt om het volgende teken letterlijk te interpreteren, waardoor grep deze niet als het begin van een optie ziet, maar wel als een te zoeken koppelteken.

Speciale klassen en reeksen kan je als volgt verkort schrijven:

Om alle opties uit de grephelp.txt te halen, gebruik je bijvoorbeeld de volgende opdracht:

dany@pindabook:~> grep "\-[[:alnum:]]," grephelp.txt
  -E, --extended-regexp     PATROON is een uitgebreide reguliere expressie
  -F, --fixed-strings       PATROON is een serie tekenreeksen,
  -G, --basic-regexp        PATROON is een gewone reguliere expressie (standaard)
  -P, --perl-regexp         PATROON is een reguliere Perl-expressie
  -e, --regexp=PATROON      dit PATROON gebruiken bij het zoeken
  -f, --file=BESTAND        patronen uit dit BESTAND halen
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -w, --word-regexp         patronen komen alleen overeen met een heel woord
  -x, --line-regexp         patronen komen alleen overeen met een hele regel
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -s, --no-messages         foutmeldingen onderdrukken
  -v, --invert-match        de niet-overeenkomende regels selecteren
  -V, --version             programmaversie tonen en stoppen
  -m, --max-count=AANTAL    na dit AANTAL overeenkomsten stoppen
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen
  -n, --line-number         bij de uitvoerregels het regelnummer tonen
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
  -a, --text                hetzelfde als '--binary-files=text'
  -d, --directories=ACTIE   mappen behandelen met deze ACTIE;
  -D, --devices=ACTIE       apparaten, FIFO's en sockets behandelen met ACTIE;
  -r, --recursive           afdalen in submappen (ofwel '--directories=recurse')
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
  -L, --files-without-match alleen namen van bestanden zonder overeenkomst tonen
  -l, --files-with-matches  alleen namen van bestanden met overeenkomsten tonen
  -c, --count               alleen het aantal overeenkomsten per bestand tonen
  -T, --initial-tab         tabs uitlijnen (eventueel een tab-teken invoegen)
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
  -B, --before-context=AANTAL   dit AANTAL regels voorafgaande context tonen
  -A, --after-context=AANTAL    dit AANTAL regels nakomende context tonen
  -C, --context=AANTAL          dit AANTAL regels context tonen
  -U, --binary              geen CR-tekens weghalen bij regeleinde (MSDOS/Windows)

Alle opties in de helptekst beginnen namelijk met een koppelteken, gevolgd door een cijfer of letter en eindigen op een komma.

Hoeveel

Een hoeveelheid (Quantifier) is een speciaal teken die andere tekens vervangt. Er zijn vier Quantifiers, waarbij de laatste drie variaties heeft:

  1. * - het teken komt niet of meerdere keren voor
  2. + - het teken komt minstens één keer voor
  3. ? - het teken komt hoogstens één keer voor
  4. {#} - het teken komt een bepaald aantal keer voor
  5. {#,} - het teken komt minstens een bepaald aantal keer voor
  6. {#,#} - het teken komt minstens een bepaald aantal keer voor, maar niet meer dan een bepaald aantal keer

Om te zoeken naar nu gevold door een willekeurig aantal l-tekens, gebruik je:

dany@pindabook:~> grep 'nul*' grephelp.txt
    Voorbeeld:  grep -i 'hallo wereld' menu.h main.c
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -n, --line-number         bij de uitvoerregels het regelnummer tonen
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
Rapporteer gebreken in het programma aan <bug-grep@gnu.org>;
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

Met * moet het l-teken dus niet eens voorkomen. Gebruik + als het l-teken minstens één keer moet voorkomen:

dany@pindabook:~> grep 'nul\+' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam

Ook hier moet je het + teken door een backslash laten voorafgaan om te verhinderen dat grep die niet zelf gaat interpreteren, maar het als een deel van de reguliere expressie bekijkt. Ben je op zoek naar een n, gevolgd door minstens één u en daarna door minstens één l, gebruikt dan:

dany@pindabook:~> grep 'nu\+l\+' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam

Met een vraagteken zoek je naar geen enkele of meerdere keren het voorgaande teken. Om te zoeken naar een n, al dan niet gevolgd door u tekens en een l, gebruik je:

dany@pindabook:~> grep 'nu\?l' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam

Tussen accolades kan je meegeven hoeveel keer het vorige teken moet voorkomen. Om te zoeken naar nu gevolgd door twee l-tekens, gebruik je:

dany@pindabook:~> grep -E 'nul{2}' grephelp.txt
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam

Zoeken naar een bepaald aantal tekens, werkt alleen als je grep gebruikt met de optie -E (Extended, uitgebreide reguliere expressies). Zoeken naar drie opeenvolgende klinkers, lukt met de opdracht:

dany@pindabook:~> grep -E '[aeiou]{3}' grephelp.txt
  -h, --no-filename         nooit de bestandsnaam tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
  -T, --initial-tab         tabs uitlijnen (eventueel een tab-teken invoegen)
                              WANNEER is 'always' (altijd), 'never' (nooit),

Gaan we op zoek naar drie opeenvolgende medeklinkers (dus geen klinkers), dan gebruiken we:

dany@pindabook:~> grep -E '[^aeiou]{3}' grephelp.txt
Gebruik:  grep [OPTIE...] PATROON [BESTAND...]
Zoekt naar PATROON in ieder gegeven BESTAND.
    Voorbeeld:  grep -i 'hallo wereld' menu.h main.c
Keuze en interpretatie van het patroon:
  -E, --extended-regexp     PATROON is een uitgebreide reguliere expressie
  -F, --fixed-strings       PATROON is een serie tekenreeksen,
                              elke tekenreeks op een aparte regel
  -G, --basic-regexp        PATROON is een gewone reguliere expressie (standaard)
  -P, --perl-regexp         PATROON is een reguliere Perl-expressie
  -e, --regexp=PATROON      dit PATROON gebruiken bij het zoeken
  -f, --file=BESTAND        patronen uit dit BESTAND halen
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -w, --word-regexp         patronen komen alleen overeen met een heel woord
  -x, --line-regexp         patronen komen alleen overeen met een hele regel
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -s, --no-messages         foutmeldingen onderdrukken
  -v, --invert-match        de niet-overeenkomende regels selecteren
  -V, --version             programmaversie tonen en stoppen
      --help                deze hulptekst tonen en stoppen
  -m, --max-count=AANTAL    na dit AANTAL overeenkomsten stoppen
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen
  -n, --line-number         bij de uitvoerregels het regelnummer tonen
      --line-buffered       elke uitvoerregel direct tonen
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
      --label=LABEL         dit LABEL als naam voor standaardinvoer gebruiken
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
      --binary-files=TYPE   aannemen dat binaire bestanden van dit TYPE zijn;
                              TYPE is 'binary' (binair), 'text' (als tekst),
                              of 'without-match' (alsof geen overeenkomsten)
  -a, --text                hetzelfde als '--binary-files=text'
  -I                        hetzelfde als '--binary-files=without-match'
  -d, --directories=ACTIE   mappen behandelen met deze ACTIE;
                              ACTIE is 'read', 'recurse' of 'skip'
                              (ofwel lezen, in-afdalen, of overslaan)
  -D, --devices=ACTIE       apparaten, FIFO's en sockets behandelen met ACTIE;
                              ACTIE is 'read' of 'skip' (lezen of overslaan)
  -r, --recursive           afdalen in submappen (ofwel '--directories=recurse')
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
                                   voldoen
      --exclude-from=BESTAND     bestanden overslaan die aan een patroon in
                                   BESTAND voldoen
      --exclude-dir=PATROON      mappen overslaan die aan PATROON voldoen
  -L, --files-without-match alleen namen van bestanden zonder overeenkomst tonen
  -l, --files-with-matches  alleen namen van bestanden met overeenkomsten tonen
  -c, --count               alleen het aantal overeenkomsten per bestand tonen
  -T, --initial-tab         tabs uitlijnen (eventueel een tab-teken invoegen)
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
Contextbesturing:
  -B, --before-context=AANTAL   dit AANTAL regels voorafgaande context tonen
  -A, --after-context=AANTAL    dit AANTAL regels nakomende context tonen
  -C, --context=AANTAL          dit AANTAL regels context tonen
  -AANTAL                       hetzelfde als '--context=AANTAL'
      --color[=WANNEER],
      --colour[=WANNEER]    overeenkomende tekst gekleurd weergeven;
                              WANNEER is 'always' (altijd), 'never' (nooit),
                              of 'auto' (gepast voor uitvoerdoel; standaard)
  -U, --binary              geen CR-tekens weghalen bij regeleinde (MSDOS/Windows)
Indien BESTAND '-' is, wordt standaardinvoer gelezen.  Zonder een BESTAND
wordt '.' gelezen indien in recursieve modus, anders wordt '-' gelezen.
Bij minder dan twee BESTANDen wordt '-h' aangenomen.
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er
een fout optreedt en '-q' is niet gegeven, dan is de afsluitwaarde 2.
Rapporteer gebreken in het programma aan <bug-grep@gnu.org>;
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

Dit was duidelijk niet de volledige oplossing. Zo blijken spaties ook geen klinkers te zijn. Om medeklinkers zonder witruimte te zoeken:

dany@pindabook:~> grep -E '[^aeiou[:space:]]{3}' grephelp.txt
Gebruik:  grep [OPTIE...] PATROON [BESTAND...]
Zoekt naar PATROON in ieder gegeven BESTAND.
    Voorbeeld:  grep -i 'hallo wereld' menu.h main.c
Keuze en interpretatie van het patroon:
  -E, --extended-regexp     PATROON is een uitgebreide reguliere expressie
  -F, --fixed-strings       PATROON is een serie tekenreeksen,
  -G, --basic-regexp        PATROON is een gewone reguliere expressie (standaard)
  -P, --perl-regexp         PATROON is een reguliere Perl-expressie
  -e, --regexp=PATROON      dit PATROON gebruiken bij het zoeken
  -f, --file=BESTAND        patronen uit dit BESTAND halen
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -w, --word-regexp         patronen komen alleen overeen met een heel woord
  -x, --line-regexp         patronen komen alleen overeen met een hele regel
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -s, --no-messages         foutmeldingen onderdrukken
  -v, --invert-match        de niet-overeenkomende regels selecteren
  -V, --version             programmaversie tonen en stoppen
      --help                deze hulptekst tonen en stoppen
  -m, --max-count=AANTAL    na dit AANTAL overeenkomsten stoppen
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen
  -n, --line-number         bij de uitvoerregels het regelnummer tonen
      --line-buffered       elke uitvoerregel direct tonen
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
      --label=LABEL         dit LABEL als naam voor standaardinvoer gebruiken
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
      --binary-files=TYPE   aannemen dat binaire bestanden van dit TYPE zijn;
                              TYPE is 'binary' (binair), 'text' (als tekst),
                              of 'without-match' (alsof geen overeenkomsten)
  -a, --text                hetzelfde als '--binary-files=text'
  -I                        hetzelfde als '--binary-files=without-match'
  -d, --directories=ACTIE   mappen behandelen met deze ACTIE;
                              ACTIE is 'read', 'recurse' of 'skip'
                              (ofwel lezen, in-afdalen, of overslaan)
  -D, --devices=ACTIE       apparaten, FIFO's en sockets behandelen met ACTIE;
                              ACTIE is 'read' of 'skip' (lezen of overslaan)
  -r, --recursive           afdalen in submappen (ofwel '--directories=recurse')
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
      --exclude-from=BESTAND     bestanden overslaan die aan een patroon in
                                   BESTAND voldoen
      --exclude-dir=PATROON      mappen overslaan die aan PATROON voldoen
  -L, --files-without-match alleen namen van bestanden zonder overeenkomst tonen
  -l, --files-with-matches  alleen namen van bestanden met overeenkomsten tonen
  -c, --count               alleen het aantal overeenkomsten per bestand tonen
  -T, --initial-tab         tabs uitlijnen (eventueel een tab-teken invoegen)
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
Contextbesturing:
  -B, --before-context=AANTAL   dit AANTAL regels voorafgaande context tonen
  -A, --after-context=AANTAL    dit AANTAL regels nakomende context tonen
  -C, --context=AANTAL          dit AANTAL regels context tonen
  -AANTAL                       hetzelfde als '--context=AANTAL'
      --color[=WANNEER],
      --colour[=WANNEER]    overeenkomende tekst gekleurd weergeven;
                              WANNEER is 'always' (altijd), 'never' (nooit),
                              of 'auto' (gepast voor uitvoerdoel; standaard)
  -U, --binary              geen CR-tekens weghalen bij regeleinde (MSDOS/Windows)
Indien BESTAND '-' is, wordt standaardinvoer gelezen.  Zonder een BESTAND
wordt '.' gelezen indien in recursieve modus, anders wordt '-' gelezen.
Bij minder dan twee BESTANDen wordt '-h' aangenomen.
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er
een fout optreedt en '-q' is niet gegeven, dan is de afsluitwaarde 2.
Rapporteer gebreken in het programma aan <bug-grep@gnu.org>;
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

Maar ook de hoofdletter klinkers moeten eruit:

dany@pindabook:~> grep -E '[^aeiouAEIOU[:space:]]{3}' grephelp.txt
Gebruik:  grep [OPTIE...] PATROON [BESTAND...]
Zoekt naar PATROON in ieder gegeven BESTAND.
    Voorbeeld:  grep -i 'hallo wereld' menu.h main.c
Keuze en interpretatie van het patroon:
  -E, --extended-regexp     PATROON is een uitgebreide reguliere expressie
  -F, --fixed-strings       PATROON is een serie tekenreeksen,
  -G, --basic-regexp        PATROON is een gewone reguliere expressie (standaard)
  -P, --perl-regexp         PATROON is een reguliere Perl-expressie
  -e, --regexp=PATROON      dit PATROON gebruiken bij het zoeken
  -f, --file=BESTAND        patronen uit dit BESTAND halen
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -w, --word-regexp         patronen komen alleen overeen met een heel woord
  -x, --line-regexp         patronen komen alleen overeen met een hele regel
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -s, --no-messages         foutmeldingen onderdrukken
  -v, --invert-match        de niet-overeenkomende regels selecteren
  -V, --version             programmaversie tonen en stoppen
      --help                deze hulptekst tonen en stoppen
  -m, --max-count=AANTAL    na dit AANTAL overeenkomsten stoppen
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen
  -n, --line-number         bij de uitvoerregels het regelnummer tonen
      --line-buffered       elke uitvoerregel direct tonen
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
      --label=LABEL         dit LABEL als naam voor standaardinvoer gebruiken
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
      --binary-files=TYPE   aannemen dat binaire bestanden van dit TYPE zijn;
                              TYPE is 'binary' (binair), 'text' (als tekst),
                              of 'without-match' (alsof geen overeenkomsten)
  -a, --text                hetzelfde als '--binary-files=text'
  -I                        hetzelfde als '--binary-files=without-match'
  -d, --directories=ACTIE   mappen behandelen met deze ACTIE;
                              ACTIE is 'read', 'recurse' of 'skip'
                              (ofwel lezen, in-afdalen, of overslaan)
  -D, --devices=ACTIE       apparaten, FIFO's en sockets behandelen met ACTIE;
                              ACTIE is 'read' of 'skip' (lezen of overslaan)
  -r, --recursive           afdalen in submappen (ofwel '--directories=recurse')
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
      --exclude-from=BESTAND     bestanden overslaan die aan een patroon in
      --exclude-dir=PATROON      mappen overslaan die aan PATROON voldoen
  -L, --files-without-match alleen namen van bestanden zonder overeenkomst tonen
  -l, --files-with-matches  alleen namen van bestanden met overeenkomsten tonen
  -c, --count               alleen het aantal overeenkomsten per bestand tonen
  -T, --initial-tab         tabs uitlijnen (eventueel een tab-teken invoegen)
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
Contextbesturing:
  -B, --before-context=AANTAL   dit AANTAL regels voorafgaande context tonen
  -A, --after-context=AANTAL    dit AANTAL regels nakomende context tonen
  -C, --context=AANTAL          dit AANTAL regels context tonen
  -AANTAL                       hetzelfde als '--context=AANTAL'
      --color[=WANNEER],
      --colour[=WANNEER]    overeenkomende tekst gekleurd weergeven;
                              WANNEER is 'always' (altijd), 'never' (nooit),
                              of 'auto' (gepast voor uitvoerdoel; standaard)
  -U, --binary              geen CR-tekens weghalen bij regeleinde (MSDOS/Windows)
Indien BESTAND '-' is, wordt standaardinvoer gelezen.  Zonder een BESTAND
wordt '.' gelezen indien in recursieve modus, anders wordt '-' gelezen.
Bij minder dan twee BESTANDen wordt '-h' aangenomen.
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er
een fout optreedt en '-q' is niet gegeven, dan is de afsluitwaarde 2.
Rapporteer gebreken in het programma aan <bug-grep@gnu.org>;
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

En de leestekens:

dany@pindabook:~> grep -E '[^aeiouAEIOU[:space:][:punct:]]{3}' grephelp.txt
Keuze en interpretatie van het patroon:
  -E, --extended-regexp     PATROON is een uitgebreide reguliere expressie
  -F, --fixed-strings       PATROON is een serie tekenreeksen,
  -G, --basic-regexp        PATROON is een gewone reguliere expressie (standaard)
  -P, --perl-regexp         PATROON is een reguliere Perl-expressie
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -z, --null-data           regels eindigen op 0-byte, niet op LF-teken
  -s, --no-messages         foutmeldingen onderdrukken
  -v, --invert-match        de niet-overeenkomende regels selecteren
      --help                deze hulptekst tonen en stoppen
  -m, --max-count=AANTAL    na dit AANTAL overeenkomsten stoppen
  -b, --byte-offset         bij de uitvoerregels het byte-adres tonen
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
  -o, --only-matching       alleen het overeenkomende regelfragment tonen
  -q, --quiet, --silent     alle normale uitvoer onderdrukken
      --binary-files=TYPE   aannemen dat binaire bestanden van dit TYPE zijn;
                              TYPE is 'binary' (binair), 'text' (als tekst),
                              of 'without-match' (alsof geen overeenkomsten)
  -a, --text                hetzelfde als '--binary-files=text'
  -I                        hetzelfde als '--binary-files=without-match'
                              (ofwel lezen, in-afdalen, of overslaan)
                              ACTIE is 'read' of 'skip' (lezen of overslaan)
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
      --exclude-from=BESTAND     bestanden overslaan die aan een patroon in
      --exclude-dir=PATROON      mappen overslaan die aan PATROON voldoen
  -L, --files-without-match alleen namen van bestanden zonder overeenkomst tonen
  -l, --files-with-matches  alleen namen van bestanden met overeenkomsten tonen
  -c, --count               alleen het aantal overeenkomsten per bestand tonen
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
Contextbesturing:
  -AANTAL                       hetzelfde als '--context=AANTAL'
      --colour[=WANNEER]    overeenkomende tekst gekleurd weergeven;
  -U, --binary              geen CR-tekens weghalen bij regeleinde (MSDOS/Windows)
Indien BESTAND '-' is, wordt standaardinvoer gelezen.  Zonder een BESTAND
wordt '.' gelezen indien in recursieve modus, anders wordt '-' gelezen.
Bij minder dan twee BESTANDen wordt '-h' aangenomen.
De afsluitwaarde is 0 in geval van overeenkomsten, anders 1; als er
een fout optreedt en '-q' is niet gegeven, dan is de afsluitwaarde 2.
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

Zoek je meer dan vier opeenvolgende medeklinkers, gebruik dan:

dany@pindabook:~> grep -E '[^aeiouAEIOU[:space:][:punct:]]{4,}' grephelp.txt
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>

Om tussen de vier en vijf opeenvolgende medeklinkers te zoeken:

dany@pindabook:~> grep -E '[^aeiouAEIOU[:space:][:punct:]]{4,5}' grephelp.txt
  -i, --ignore-case         verschil tussen hoofd- en kleine letters negeren
  -H, --with-filename       bij de uitvoerregels de bestandsnaam tonen
  -h, --no-filename         nooit de bestandsnaam tonen
  -R, --dereference-recursive   idem, maar alle symbolische koppelingen volgen
      --include=BESTANDSPATROON  alleen bestanden doorzoeken die aan
                                   BESTANDSPATROON voldoen
      --exclude=BESTANDSPATROON  bestanden overslaan die aan BESTANDSPATROON
  -Z, --null                een 0-byte invoegen na iedere bestandsnaam
meld fouten in de vertaling aan <vertaling@vrijschrift.org>.
Webpagina van GNU grep: <http://www.gnu.org/software/grep/>
Algemene hulp bij gebruik van GNU-software: <http://www.gnu.org/gethelp/>
Reguliere expressies

Je merkt wel dat reguliere expressies een krachtig hulpmiddel is. Maar je moet er wel eerst mee vertrouwd geraken. Eenmaal dat je met reguliere expressies kunt werken, en je de kracht ervan hebt ervaren, kan je al ze al snel niet meer missen. Het loont dus zeker de moeite om reguliere expressie te leren gebruiken (en vooral ermee te experimenteren) om er veel plezier aan te beleven.