REGEX
Regular Expressions
Zie ook sed en awk
Introductie
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
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.
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) |
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
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
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 |
Bij vi, ex en sed hebben de volgende metacharacters enkel een betekenis wanneer ze in vervangingspatronen gebruikt worden.
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
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) |
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 |
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 |
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
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