Terug naar blog

Grep en Regex gebruiken om te zoeken naar tekstpatronen

Grep en Regex gebruiken om te zoeken naar tekstpatronen

De grep opdracht is een krachtig hulpprogramma om naar patronen in tekst te zoeken. Het is vooraf geïnstalleerd op elke Linux distro. Hier is onze handleiding die ingaat op het opzetten van de LAMP Stack - Linux, Apache, MySQL en PHP.

De naam grep staat voor global regular expression print. De tool zoekt naar het opgegeven patroon in de invoer. In principe klinkt het triviaal. De ware kracht ligt echter in de manier waarop je het patroon definieert. Deze gids gaat dieper in op het gebruik van grep met reguliere expressies om complexe zoekopdrachten uit te voeren. Laten we beginnen!

Hoe grep te gebruiken

De grep-opdracht is op zichzelf niet ingewikkeld. Het enige wat nodig is, is het patroon en de inhoud waarop de zoekopdracht moet worden uitgevoerd. Dit is hoe de basisstructuur van de grep-opdracht eruitziet:

Tekst zoeken

Neem eerst een voorbeeldbestand om de actie op uit te voeren. Download de GNU General Public License v3.0 (in tekstformaat). Het is een vrij groot tekstbestand met veel woorden en zinnen. Als je Ubuntu gebruikt, kun je het in het onderstaande bestand vinden. Volg onze handleiding voor een snelle en eenvoudige Ubuntu-installatie.

download text file grep

Vervolgens kun je een basiszoekopdracht in tekst uitvoeren met grep:

grep text

Het is mogelijk om de uitvoer van een opdracht door te sluizen (pipen) naar grep:

grep text
Hoofdlettergevoeligheid

Standaard is grep hoofdlettergevoelig. In veel situaties kan het negeren van hoofdlettergevoeligheid optimaal zijn. Om hoofdlettergevoelig zoeken uit te schakelen, gebruik je de vlag “-i” of “–ignore-case”:

grep ignore case
Omgekeerd zoeken

Standaard is het gedrag van grep om de regels af te drukken waarin het patroon is gevonden. Omgekeerd zoeken (invert match) verwijst naar het fenomeen waarbij je de regels die overeenkomen met het patroon juist niet wilt zien. Om de overeenkomst om te keren, moet je de vlag “-v” of “–invert-match” gebruiken:

invert grep
Regelnummer

Wanneer je grep uitvoert op een zeer groot bestand, is het moeilijk om de locatie van het zoekresultaat bij te houden. Om het makkelijker te maken, heeft grep de functie om het regelnummer te tonen. Om regelnummering in te schakelen, gebruik je de vlag “-n” of “–line-number”:

line number grep
Het is mogelijk om meerdere grep-argumenten te combineren. De volgende grep-opdracht voert een omgekeerde zoekopdracht uit terwijl de regelnummers worden afgedrukt:

combine arguments of grep

Reguliere expressie

Aan het begin van deze gids vermeldden we dat grep staat voor global regular expression print. De term “reguliere expressie” is gedefinieerd als een speciale tekenreeks die het zoekpatroon beschrijft. Een reguliere expressie heeft zijn eigen structuur en regels.

Er zijn talloze algoritmen en tools voor het zoeken naar tekenreeksen die reguliere expressies (kortweg regex) gebruiken voor het uitvoeren van zoekopdrachten en vervangingsacties. Hoewel het populair is, implementeren verschillende toepassingen en programmeertalen regex net even anders. In deze sectie laten we een aantal regex-methoden zien met behulp van grep.

Letterlijke overeenkomst

In de voorgaande grep-voorbeelden voerde grep de zoekopdracht uit naar een specifieke tekenreeks in het opgegeven tekstbestand. Grep zocht eigenlijk met behulp van de meest elementaire reguliere expressie. De regex-patronen die de zoekopdracht naar de exacte overeenkomst van een gegeven tekenreeks definiëren, worden “literals” genoemd. De naam komt van het feit dat ze het patroon letterlijk matchen, karakter voor karakter.

De letterlijke overeenkomst werkt met alfabetische en numerieke tekens (evenals enkele speciale tekens). Afhankelijk van andere expressiemechanismen kan dit gedrag echter veranderen:

literal matching grep

Ankerovereenkomst

Ankers zijn speciale tekens die bepalen waar de positie van de overeenkomst in de regel moet zijn om een geldige overeenkomst te hebben. Hier is een snel voorbeeld om het te vereenvoudigen. Als we alleen de regels willen vinden die beginnen met de tekenreeks „GNU”, dan ziet de grep met regex er als volgt uit. Hier is het teken „^” het anker, dat definieert dat alleen overeenkomsten aan het begin van de regel geldig zijn:

anchor match regexp

Op dezelfde manier, als we alleen de regels willen vinden die eindigen op de tekenreeks „works”, dan ziet de grep met regex er als volgt uit. Hier is het teken „$” het anker, dat definieert dat alleen overeenkomsten aan het einde van de regel geldig zijn:

anchor matching regexp

Overeenkomst met elk willekeurig teken

Bij het uitvoeren van een tekstzoekopdracht wil je misschien definiëren dat er op een specifieke plaats een willekeurig teken kan staan. In regex wordt dit uitgedrukt door het puntteken (.).

Bekijk dit voorbeeld eens. In het GNU GPL 3-tekstbestand hebben de woorden „accept” en „except” beide het gedeelte „cept” gemeen. Bovendien hebben beide woorden twee tekens vóór het gedeelte „cept”. De volgende grep-opdracht komt overeen met elk woord dat twee tekens vóór het gedeelte „cept” heeft:

any character match grep

Volgens deze regex zijn andere woorden zoals suscept, unaccept, unexpected, enz. ook geldige overeenkomsten.

Vierkante haken

In regex definiëren expressies tussen vierkante haken dat er op de opgegeven locatie elk teken kan staan dat binnen de haken is gedeclareerd. Bekijk de volgende reguliere expressie-tekenreeks:

Wanneer je dit in de praktijk brengt, zijn de woorden too en two de geldige overeenkomsten:

bracket regexp

De expressie tussen vierkante haken opent de mogelijkheid voor een aantal interessante dingen. Het is mogelijk om expressies tussen vierkante haken te gebruiken om aan te geven dat er op de opgegeven locatie elk ander teken kan staan dan de tekens die binnen de haken zijn gedeclareerd. Bekijk de volgende regex-tekenreeks. De overeenkomst is alleen geldig als er een ander teken dan „c” vóór „ode” staat:

Voer het uit op het GPL-3-licentietekstbestand:

bracket regexp

Naast het resultaat uit het bestand, zouden andere geldige resultaten node, abode, anode, enz. zijn. Expressies tussen vierkante haken kunnen ook een bereik van tekens beschrijven. De volgende regex geeft aan dat de overeenkomst geldig is als het begin van de regel een hoofdletter is:

Voer het uit op het GPL-3-licentietekstbestand. Dit zullen alle regels in het tekstbestand zijn:

bracket regexp

Voor het gebruiksgemak zijn er bepaalde tekenklassen die specifieke labels hebben. In het vorige voorbeeld gebruikten we het bereik „A-Z” om de hoofdletters te definiëren. In plaats daarvan kunnen we ook „[:upper:]” gebruiken. Het resultaat zal hetzelfde zijn:

Een patroon herhalen

In bepaalde situaties wil je een specifiek patroon of regex nul of meer keer matchen. Hiervoor is het metateken de asterisk (*). De volgende reguliere expressie komt overeen met alle haakjes met alleen letters en enkele spaties ertussen. Merk op dat de declaratie van de kleine letters, hoofdletters en spaties samenstaan zonder enige interpunctie:

Breng de regex in de praktijk met grep:

repeating pattern
Metatekens gebruiken als letterlijke tekens

Tot nu toe hebben we kennisgemaakt met verschillende metatekens zoals de asterisk (*), punt (.), ankers (^ en $), enz. Elk daarvan heeft een unieke functie in de context van regex. Het probleem ontstaat wanneer ze als letterlijke tekens moeten worden gebruikt, en niet als metatekens. In dergelijke situaties geeft een backslash (\\) voor het metateken aan dat het in letterlijke zin moet worden gebruikt, en niet als metateken. Bekijk dit regex-voorbeeld eens. Het zal overeenkomen met alle regels die beginnen met een hoofdletter en eindigen met een punt:

meta character regexp
Alternatie

Met behulp van expressies tussen vierkante haken kunnen we verschillende mogelijke keuzes opgeven voor een overeenkomst met één enkel teken. Regex heeft de functie om hetzelfde te doen met woorden en zinnen. Om een alternatie aan te geven, wordt het sluisteken (|) gebruikt. De opties staan tussen haakjes, terwijl het sluisteken ze van elkaar scheidt. Er kunnen twee of meer mogelijke opties zijn om de overeenkomst geldig te laten zijn. Bekijk het volgende regex-voorbeeld. Het zal overeenkomen met zowel “GPL” als “General Public License”:

alternate choices of grep
Kwantoren

Met het metateken asterisk (*) konden we een patroon herhaaldelijk nul of meer keer definiëren. Er is echter meer om mee te werken. Het is gemakkelijker om de kwantoren uit te leggen met een voorbeeld. De volgende reguliere expressie beschrijft dat zowel “copyright” als “right” geldige overeenkomsten zijn. Het vraagteken (?) geeft aan dat het gedeelte “copy” optioneel is om mee overeen te komen:

quantifiers regexp

De volgende kwantor is het plusteken (+). Dit gedraagt zich op een vergelijkbare manier als de asterisk. Het gedefinieerde patroon moet echter ten minste één keer overeenkomen. In het volgende voorbeeld zal de reguliere expressie overeenkomen met “soft” gevolgd door één of meer niet-witruimtetekens:

Herhaling van overeenkomst specificeren

Het is mogelijk om het aantal keren dat een overeenkomst wordt herhaald te specificeren. Gebruik hiervoor de accolades ({}). De volgende reguliere expressie komt overeen met elk woord dat minimaal drie klinkers bevat:

match repetition regexp

Met deze functie kunt u ook de onder- en bovengrens van de lengte van de overeenkomst definiëren. In het volgende voorbeeld zal de regex overeenkomen met elk woord dat 10-15 tekens lang is:

match repetition regexp

Conclusie

Het doorzoeken van tekstbestanden met grep is erg handig. Reguliere expressies maken het zoeken met grep interessanter en nuttiger. Ze stemmen het zoekpatroon ook af op uw specifieke wensen.

Hoewel we enkele van de meest voorkomende reguliere expressies hebben gedemonstreerd, is dit nog maar het begin. Er zijn meer geavanceerde reguliere expressies die de meest nauwkeurige controle bieden over het zoekgedrag. Naast grep worden reguliere expressies ook veel gebruikt door andere tools en programmeertalen.

Veel computerplezier!

 

author

Akshay Nagpal

Auteur · CloudSigma

Preslav Dobrev is een creatief ontwerper bij CloudSigma, met de nadruk op een consistente bedrijfsidentiteit door middel van traditionele en innovatieve marketingkanalen. Hij is bedreven in het samenvoegen van artistieke visie met strategische marketing om impactvolle merkverhalen te creëren.

Reacties

Nog geen reacties. Wees de eerste.