REGEX

Regular Expressions

Zie ook sed en awk

Introductie

Verschillende *nix1 programma's maken gebruik van Tekst Patronen of Regular Expressions of RegEx. Enkele van deze programma's zijn:
  • ed (tekst editor)
  • ex (text editor)
  • vi (tekst editor)
  • sed (stream editor)
  • awk (programmeertaal)
  • grep / egrep (patroon zoekkers)
  • BASH en andere Shells

Regular Expressions zijn combinaties van gewone tekens met wat men metacharacters noemt, in tegenstelling tot een vaste "zoektekst" kun je met RegEx zoeken op tekst patronen, wat dit een zeer krachtige tool maakt.

Omdat bepaalde shells (zoals bash) ook werken met regEx moeten we een commando in bash iets anders formuleren dan gewoon:

$ grep [A-Z]* chap[12]

Zal door bash getransformeerd worden tot:

grep Aantal.txt Besteld.txt chap1 chap2

En grep zal dan gaan zoeken naar het patroon Aantal.txt in bestanden Besteld.txt, chap1 en chap2. Om dit te voorkomen moeten we de speciale tekens voor grep tussen aanhalingstekens ("") zetten. Meestal zullen de gewone dubbele aanhalingstekens (") voldoende zijn, maar de veiligste optie is het gebruik van enkele aanhalingstekens (').

$ grep '[A-Z]*' chap [12]

Zoekpatronen

Bij Regular Expressions varieert de betekenis van een metacharacter afhankelijk van de situatie waarin we het gebruiken, indien we deze als zoekpatroon gebruiken, hebben ze de volgende betekenis
Tabel 1. Zoekpatronen
Metacharacter Patroon
. Match ieder enkel teken, behalve een nieuwe regel-teken. Kan bij awk ingesteld worden dat het wel een match geeft bij een nieuwe regel-teken.
* Match een willekeurig aantal (of geen) tekens van een enkel karakter dat er onmiddellijk voor komt. Het voorgaande teken/karakter kan ook een regular expression zijn. Bijvoorbeeld: Omdat . ieder teken betekend zal .* ieder aantal van ieder karakter.
^ Match de volgende regular expression bij het begin van de regel of tekenreeks
$ Match de voorgaande regular expression aan het einde van de regel of tekenreeks
\ Zet de speciale betekenis van het volgende teken uit (* zal dan gewoon * betekenen).
[ ] Match ieder van de tekens die tussen de haakjes staat. een streepje (-) geeft een bereik van opeenvolgende tekens aan ([A-Z] bijvoorbeeld). Als er een accent circumflex (^) als eerste teken tussen de haakjes staat wordt de betekenis omgekeerd (met betekend dan niet match met de tekens maar sluit deze tekens uit). Een streepje (-) of sluitingshaakje (]) als eerste teken zal geïnterpreteerd worden als onderdeel van de lijst. Alle andere metacharacters worden beschouwd als onderdeel van de lijst (letterlijk dus).
{ n, m } Match met een bereik van n tot mkeer dat het teken vorkomt (onmiddellijk hierna). Het voorgaande teken kan ook een metacharacter zijn. {n} matched exact n aantal keren en {n ,} matched met tenminste n keer. {n , m} tenslotte matched tussen de n en m keer. De waarden voor n en m moeten tussen 0 en 255 liggen.
\{ n,m \} Exact hetzelfde als {n ,m}
\( \) Bewaar het patroon dat tussen de haakjes staat in een speciale bewaarplaats (er zijn er 9 van deze beschikbaar voor een enkele regel). De opgeslagen matchen kunnen "terug afgespeeld" worden door het commando te vervangen door \1 tot \9
\n Speel het nde patroon (in \( en \) opnieuw af in het patroon op deze plaats. n is een getal van 1 tot 9 waarvan 1 links begint
\< \> Match met tekens die beginnen (\<) of eindigen (\>) bij een woord
+ Match een of meer keer dat een voorgaande RegEx voorkomt
? Match met 1 of geen keer dat een voorgaande RegEx voorkomt
| Match met Regex die ervoor of erna gespecificeerd is
( ) Pas een match toe op de groep van RegEx tussen de haakjes

Veel *NIX systemen staan het gebruik van POSIX2 tekens binnen rechthoekige haakjes ([]) die een klasse van tekens aangeeft toe. Deze types worden omsloten door [: en :] . Bijvoorbeeld [[:alnum:]] geeft een match met 1 alfanumeriek teken.

Deze klassen zijn
Tabel 2. Klassen
Klasse Tekens
alnum Alfanumerieke tekens (cijfers en letter)
alpha Alfabetische tekens (letters en geen cijfers)
blank spatie of TAB
cntrl Controle Tekens
digit Decimale tekens
graph nonespace tekens
lower kleine letters (géén HOOFDLETTERS)
print Afdrukbare tekens
space whitespace telens (spatie, TAB)
upper Hoofdletters (géén kleine letters)
xdigit Hexadecimale teken (bijv. 0xFE)

Vervangingspatronen

De volgende metacharacters hebben de betekenis in deze lijst enkel als ze gebruikt worden bij vervangingspatronen

Tabel 3. Vervangingspatronen
Metacharacter Patroon
\ Schakel de speciale betekenis van het volgende metacharacter uit.
\ n Herstel de tekst die gematched is door het n-de patroon dat eerder is opgeslagen door \( en \). n is een getal tussen 1 en 9, waarbij 1 links begint.
& Hergebruik de gematchete tekst van het zoekpatroon als onderdeel van het vervaningspatroon
~ Hergebruik het vorige vervangingspatroon in het huidige vervangingspatroon. Moet het enige teken zijn in het vervangingspatroon (ex en vi)
% Hergebruik het vorige vervangingspatroon in het huidige vervangingspatroon. Moet het enige teken zijn in het vervangingspatroon (ed)
\u Vervang het eerste teken van het vervangingspatroon met een Hoofdletter (zoek wordt Zoek)
\u Vervang het volledige vervangingspatroon met Hoofdletters (zoek wordt ZOEK)
\l Vervang het eerste teken van het vervangingspatroon met een kleine letter (Zoek wordt zoek)
\L Vervan het volledig vervangingspatroon met een kleine letter (ZOEK wordt zoek)
\E Schakel de vorige \U of \L uit
\e Schaken de vorige \u of \l uit

Metacharacters per Programma

Niet ieder programma werkt met alle metacharacters, in de onderstaande tabel kun je zien welke metacharacters werken bij welke *NIX programma's
Tabel 4. Opgelijst per programma
Symbool ed ex vi sed awk grep egrep Actie
. ° ° ° ° ° ° ° Match met ieder teken
* ° ° ° ° ° ° ° Match met nul of meer van de voorgaande tekens3
^ ° ° ° ° ° ° ° Match het begin van de regel of tekenreeks (string)
$ ° ° ° ° ° ° ° Match het einde van de regel of tekenreeks
\ ° ° ° ° ° ° ° Escape het volgende teken ($ is dan gewoon $)
[ ] ° ° ° ° ° ° ° Match met één van deze set
\( \( ° ° ° ° ° Bewaar patroon om later "te herhalen"
\n ° ° ° ° ° Herhaal sub-patroon in match
{ } ° ° Match een bereik
\{ \} ° ° ° Match een bereik
\< \> ° ° ° Match begin of einde van een woord
+ ° ° Match een of meer van de voorgaande
? ° ° Match met nul of een van de voorgaande
| ° ° Scheid keuzen om te matchen
( ) ° ° Groepeer te matchen expressie
Opmerking: Merk op dat bij vi, ed, ex, en sed zowel het zoek- (links) als vervangpatroon (rechts) opgeeft. De hierboven vermelde metacharacters hebben enkel deze betekenis wanneer ze binnen zoekpatronen gebruikt worden.

Bij vi, ex en sed hebben de volgende metacharacters enkel een betekenis wanneer ze in vervangingspatronen gebruikt worden.

Tabel 5. Vervangpatronen per programma
Symbool ex vi sed ed Actie
\ ° ° ° ° "Escape" het vorige symbool (de speciale betekenis valt weg)
\ n ° ° ° ° Tekst die matched met het patroon opgeslagen in \( \)
& ° ° ° ° Tekst die matched met een zoekpatroon
~ ° ° Hergebruik het vorige vervangings-patroon
% ° Hergebruik het vorige vervangings-patroon
\u \U ° ° Verander teken(s) naar HOOFDLETTERS
\l \L ° ° Verander teken(s) naar kleine letters
\E ° ° Schakel de vorige \U of \L uit
\e ° ° Schakel de vorige \u of \l uit

Zoeken

Genoeg theorie, laten we eens een paar voorbeelden geven, te beginnen met zoekpatronen.
Opmerking: Als je grep of egrep gebruikt, moeten de regular expressions ingesloten zijn tussen aanhalingstekens. (en als het patroon een $ bevat met je enkele haakjes (') gebruiken. Bij ed, ex, sed en awk worden regular expressions vaak ingesloten tussen / hoewel vele andere "delimiters" ook gebruikt kunnen worden (behalve bij awk.).
Tabel 6. Zoekpatroon voorbeelden
Patroon Waarmee geeft het een match
tas De tekenreeks tas
^tas tas aan het begin van de regel
tas$ tas aan het einde van de tegel
^tas$ tas als het enige woord op de regel
[Tt]as Tas of tas
t[aeiou]s De tweede letter is een klinker (tas, tis, ...)
t[^aeiou]s De tweede letter is een medeklinker (of een hoofdletter of een symbool). alles behalve a, e, i, o of u
t.s De twede letter is ieder mogelijk teken (tas, t@s, t4s, ...)
^...$ Iedere regel die exact drie tekens bevat
^\. Iedere regel die begint met een punt (.) hier schakelt de \ de speciale betekenis van . uit
^\.[a-z][a-z] Hetzelfde als de voorgaande, gevolg door 2 kleine letters (bijvoorbeeld .ta) (o.a. gebruikt bij troff commando's)
^\.[a-z]\ {2\} Hetzelfde als de voorgaande (enkel gebruikt bij ed, sed en grep)
^[.] Iedere regel die niet begint met een punt (.)
tas* ta, tas, tass, etc.
"woord" een woord tussen aanhalingstekens
"*woord"* Een woord zonder aanhalingstekens
[A-Z][A-Z]* Een of meer hoofdletters
[A-Z]+ Hetzelfde als de vorige (enkel bij egrep of awk)
[[:upper:]]+ Hetzelfde als de vorige (bij POSIX egrep of awk)
[A-Z].* Een hoofdletter, gevolgt door 1 of meer tekens
[A-Z]* Nul of meer HOOFDLETTERS
[a-zA-Z] Iedere letter (zowel kleine als HOOFDLETTERS)
[^0-9A-Za-z] Ieder symbool of spatie (geen cijfers of letters)
[^[:alnum:]] Hetzelfde als voorgaande (gebruik makend van de POSIX character klasse)
Tabel 7. egrep of awk
egrep of awk patroon Met wat geeft het een match
[567] Een of meer van de getallen 5, 7 of 7
een|twee|drie Een van de woorden een, twee of drie
80[2-4]?86 8086, 80286, 80386 of 80486
80[2-4]?86|Pentium 8086, 80286, 80386, 80486 of Pentium
bedrij(f|ven) bedrijf of bedrijven
Tabel 8. ex of vi
ex of vi patroon Met wat geeft het een match
\<the woorden zoals theater, thee of the
the\> woorden zoals breath, seethe of the
\<thee\> het woord thee
Tabel 9. ed, sed of grep
ed, sed of grep patroon Met wat geeft het een match
0\{5,\} Vijf of meer nullen na elkaar (00000)
[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\} Sociale zekerheidsnummer V.S. (123-45-6789)
\(tas\).*\1 Een lijn waarop het woord tas twee keer voorkomt

Zoeken en Vervangen

De volgende tabel geeft enkele voorbeelden van de beschikbare metacharacters voor sed of ex.
Opmerking: Merk op dat alle ex4 commando's beginnen met een dubbelepunt (:). Een spatie wordt aangegeven met een ¤ en een TAB met »
Tabel 10. sed en ex
Commando Resultaat
s/.*/( & )/ Doe de volledige lijn opnieuw maar voeg haakjes toe
s/.*/mv & &.old/ Vervang een woordlijst (één woord per regel) in een mv commando
/^$/d Wis lege regels
:g/^$/d Hetzelfde als de vorige (in de ex editor)
/^[ ¤ » ]*$/d Wis lege regels, en regels die enkel spaties of ¤ bevatten
:g/^[ ¤ » ]*$/d Hetzelfde als de vorige (in de ex editor)
s/ ¤ ¤ */ ¤ /g Maak van een of meerdere spaties een spatie
:%s/ ¤ ¤ */ ¤ /g Hetzelfde als de vorige (in de ex editor)
:s/[0-9]/Item &:/ Maak van een getal een item label (op de huidige regel).
:s Herhaal de vorige vervanging
:& Hetzelfde als de vorige
:sg Hetzelfde als de vorige
:&g Hetzelfde als de vorige
:%&g Herhaal de vervanging globaal (op iedere regel
:.,$s/Fortran/\U&/g Op de huidige regel, tot de laatste verander het woord naar hoofdletters
:%s/.*/\L&/ Maak de volledige regel kleine letters
:s/\<.*/\u&/g Maak van ieder woord op deze regel de eerste letter een Hoofdletter (handig voor titels)
:%s/yes/No/g Verander (globaal) een woord in No
:%s/Yes/~/g Verander (globaal) een ander woord in No (vorige vervanging).

Zie ook grep/egrep, sed en awk

1 *NIX wordt vaak gebruikt om te verwijzen naar UNIX® of UNIX-achtige besturingssystemen zoals Linux®, BSD®, macOS®, Solaris®, ...).
2 Portable Operating System Interface, dit is een reeks standaarden die ervoor moet zorgen dat besturingssystemen onderling compatibel blijven. Een onderdeel van POSIX is bijvoorbeeld de directory structuur van (bijna) alle Linux Distributies en het standaard aanwezig zijn van de vi (of tegenwoordig meestal VIM) editor op iedere Linux Distributie.
3 Opgeslagen sub-patronen kunnen "herhaalt" worden tijdens het matchen.
4 de vi/Vim editors bieden ondersteuning voor de ex editor commando's