Hoofdstuk 11. Tekst tools

head, tail, grep, wc, tr, sed, perl enzovoort

Reguliere expressies

Een reguliere expressie is een beschrijving van een set tekens. Deze beschrijving kan worden gebruikt om door een bestand te zoeken naar tekst welke overeenkomt met de reguliere expressie. Reguliere expressies zijn analoog aan shell-wildcards (zie de paragraaf Bestandsnaam uitbreiding ("Wildcards") in Hoofdstuk 6), maar ze zijn gecompliceerder en krachtiger.

Een reguliere expressie is samengesteld uit tekst en metacharacters. Een metacharacter is gewoon een teken met een speciale betekenis. Metacharacters zijn onder andere: . * [] - \ ^ $.

Als een reguliere expressie uit alleen tekst bestaat (geen metacharacters), dan komt het overeen met die tekst. Als voorbeeld, de reguliere expressie 'mijn reguliere expressie' komt overeen met de tekst 'mijn reguliere expressie', en niets anders. Reguliere expressies zijn meestal hoofdlettergevoelig.

Je kunt de opdracht egrep gebruiken om alle regels in een bestand weer te geven die een reguliere expressie bevatten. De syntax ervan is:

egrep 'regexp' filename1 ... [1]

Om bijvoorbeeld alle regels in de GPL op te zoeken met daarin het woord GNU, typ je:
egrep 'GNU' /usr/doc/copyright/GPL

egrep zal de regel naar standaard output afdrukken.

Als je alle regels met daarin freedom, gevolgd door wat onbepaalde tekst, gevolgd door GNU wilt, tik je in:
egrep 'freedom.*GNU' /usr/doc/copyright/GPL

De . betekent "elk teken"; de * betekent "nul of meer van het voorafgaande," in dit geval "nul of meer van elk teken." Dus .* komt zo'n beetje met alle tekst overeen. egrep maakt alleen een vergelijking op basis van een regel-per-regel, dus freedom en GNU moeten op dezelfde regel voorkomen.

Hier is een samenvatting van reguliere expressie metacharacters:

.

Komt overeen met ieder enkel teken behalve een newline.

*

Komt overeen met nul of meer voorkomens van het voorgaande. Dus de expressie a* komt overeen met 0 of meer kleine letters a, en .* komt overeen met nul of meer tekens.

[tekens]

Tussen de blokhaken moeten één of meer tekens staan; de gehele expressie tussen blokhaken komt overeen met exact één teken uit de set. Dus [abc] komt overeen met een a, een b, of een c; het komt niet overeen met 0 tekens, en het komt niet overeen met andere tekens dan deze drie.

^

Verankert je zoekopdracht aan het begin van de regel. De expressie ^De komt alleen overeen met De aan het begin van een regel; er mogen geen spaties of andere tekst voor De voorkomen. Als je spaties toe wilt staan, kun je 0 of meer spatie-tekens als volgt toevoegen: ^ *De.

$

Verankering aan het einde van de regel. end$ vereist dat de tekst end aan het einde van de regel voorkomt, zonder tussenliggende spaties of tekst.

[^tekens]

^ draait de betekenis van een door blokhaken omsloten lijst met tekens om. Dus [^abc] komt overeen met ieder enkel teken, behalve a, b, of c.

[teken-teken]

Je kunt bereiken in een door blokhaken omsloten lijst opnemen. Gebruik [a-z] om enkel en alleen een vergelijking met kleine letters te maken. Je kunt van meer dan één bereik gebruik maken; dus om het passend te maken met de eerste of laatste drie letters van het alfabet, gebruik je [a-cx-z]. Voor het verkrijgen van elke letter, hoofd- of kleine letter, gebruik je [a-zA-Z]. Je kunt bereiken met enkele tekens en met het ^ metacharacter combineren; Bijvoorbeeld [^a-zBZ] heeft als betekenis "alles behalve een kleine letter, hoofdletter B, of hoofdletter Z."

()

Net als in een mathematische expressie, kun je haakjes gebruiken om delen van de reguliere expressie te groeperen.

|

| betekent "of" --- je kunt het gebruiken om te voorzien in een serie alternatieve expressies. Het is gebruikelijk de alternatieven tussen haakjes te plaatsen, zoals c(ad|ab|at); dit komt overeen met cad of cab of cat. Zonder haakjes zou het in plaats daarvan overeenkomen met cad of ab of at.

\

Ontdoet een teken van zijn speciale betekenis; als je naar een letterlijke * wilt zoeken, typ je \*. De slash betekent dat de gebruikelijke betekenis van * moet worden genegeerd.

Hier zijn nog wat meer voorbeelden, om je te helpen het in de vingers te krijgen:

c.pe

komt overeen met cope, cape, caper

c\.pe

komt overeen met c.pe, c.per

sto*para

komt overeen met stp, stop, stoop

car.*n

komt overeen met carton, cartoon, carmen

xyz.*

Komt overeen met xyz en alles wat daar achter komt; een aantal tools, zoals egrep, zullen het alleen overeen laten komen tot aan het einde van de regel.

^De

Komt overeen met De aan het begin van een regel.

atime$

Komt overeen met atime aan het einde van een regel.

^Alleen$

Komt overeen met een regel die bestaat uit slechts het woord Alleen --- geen spaties, geen andere tekens, niets. Slechts Alleen is toegestaan.

b[aou]rn

Komt overeen met barn, born, burn

Ver[D-F]

Komt overeen met VerD, VerE, VerF

Ver[^0-9]

Komt overeen met Ver gevolgd door een teken niet zijnde een cijfer.

the[ir][re]

Komt overeen met their, therr, there, theie

[A-Za-z][A-Za-z]*

komt overeen met elk woord dat uit alleen letters en op z'n minst één letter bestaat. Zal niet overeenkomen met nummers of spaties.

Noten

[1]

De enkele aanhalingstekens zijn niet altijd nodig, maar het kan nooit kwaad.