Regelmatig updates van de Bash-opdrachtregel

N
Netooze
31 januari 2020

RegEx (of RegExp) is een reeks tekens die een zoekpatroon definiëren. Ze kunnen worden gebruikt om zoek- en vervangingsbewerkingen uit te voeren, maar ook om voorwaarden zoals wachtwoordbeleid, telefoonnummerinvoer, enzovoort te controleren.

Hier is een voorbeeld van een reguliere expressie:

/t[aeiou]l/

Deze reguliere expressie zoekt naar een woord dat begint met de letter 't', een van de letters 'aeio u' in het midden bevat en eindigt met de letter 'l'. Het kan 'tel', 'tal' of 'til' zijn. De match kan een enkel woord zijn of een deel van een ander woord, zoals 'tilt', 'brutal' of 'telephone'.

Laten we nu, met de Bash-shell als voorbeeld, kijken naar fundamentele reguliere expressies.

Basisprincipes van reguliere expressies

De algemene syntaxis voor het 'grep'-commando is als volgt:

$ grep поисковый_запрос_regex расположение_файла

Laten we eens kijken naar enkele speciale tekens die bekend staan ​​als metatekens. Ze helpen bij het maken van complexere zoekuitdrukkingen:

. komt overeen met elk teken;
[] komt overeen met het bereik van tekens;
[^ ] komt overeen met alle karakters behalve die gespecificeerd tussen accolades;
* komt overeen met een willekeurig aantal tekens voorafgaand aan de asterisk, inclusief nul;
+ zal overeenkomen met een of meer van de expressies ervoor;
? komt overeen met nul of een van de expressies ervoor;
{N} zal overeenkomen met 'n' herhalingen van voorgaande uitdrukkingen;
{N,} komt overeen met ten minste 'n' herhalingen van de voorgaande uitdrukkingen;
{nm} komt overeen met minimaal 'n' en maximaal 'm' herhalingen van de voorgaande uitdrukkingen;
{,m} zal overeenkomen met ten hoogste of gelijk aan 'm' herhalingen van de voorgaande uitdrukkingen;
is een escape-teken (escape-teken) dat wordt gebruikt wanneer een van de metatekens moet worden opgenomen.

Hier zijn een paar voorbeelden:

. (punt)

Wordt gebruikt om te matchen met elk teken dat in de zoekopdracht wordt weergegeven. We kunnen een punt bijvoorbeeld gebruiken als:

$ grep "d.g" file1

Deze reguliere expressie betekent dat we zoeken naar een woord dat begint met 'd', eindigt op 'g' en elk willekeurig teken kan bevatten in het midden van een bestand met de naam 'file1'. Op dezelfde manier kunnen we het puntteken een willekeurig aantal keren gebruiken voor ons zoekpatroon, zoals:

T......h

Deze zoekterm zoekt naar een woord dat begint met 'T', eindigt met 'h' en zes willekeurige tekens in het midden kan bevatten.

[]

Vierkante haken worden gebruikt om een ​​reeks tekens te definiëren. Als u bijvoorbeeld naar een van de weergegeven tekens moet zoeken en niet naar een teken, zoals in het geval van een punt:

$ grep "N[oen]n" file2

Hier zoeken we naar een woord dat begint met 'N', eindigt op 'n' en alleen 'o', 'e' of 'n' in het midden kan hebben. U kunt een willekeurig aantal tekens tussen vierkante haken gebruiken. We kunnen ook bereiken zoals 'ae' of '1-18' definiëren als een lijst met overeenkomende tekens tussen haakjes.

[^ ]

Dit is vergelijkbaar met de ontkenningsoperator voor reguliere expressies. Het gebruik van [^ ] betekent dat de zoekopdracht alle tekens omvat, behalve die tussen vierkante haken. Bijvoorbeeld:

$ grep "St[^1-9]d" file3

Dit betekent dat we alle woorden kunnen hebben die beginnen met 'St', eindigen op 'd' en niet de cijfers 1 tot en met 9 bevatten.

Tot nu toe hebben we voorbeelden gebruikt van reguliere expressies die alleen op zoek zijn naar een enkel teken. Maar wat te doen in andere gevallen? Als u bijvoorbeeld alle woorden wilt zoeken die beginnen of eindigen met een teken, of een willekeurig aantal tekens in het midden kunnen bevatten. Deze taak wordt afgehandeld door de zogenaamde quantifier-meta-tekens, die bepalen hoe vaak de voorgaande uitdrukking kan voorkomen: + * & ?

{n}, {nm}, {n, } of { ,m} zijn ook voorbeelden van andere kwantoren die we kunnen gebruiken in termen van reguliere expressies.

* (sterretje)

Het volgende voorbeeld toont een willekeurig aantal keren dat de letter 'k' voorkomt, inclusief geen:

$ grep "lak*" file4

Dit betekent dat we 'meer' of 'la' of 'lakkkkk' kunnen matchen.

+

Het volgende patroon vereist dat de letter 'k' in een tekenreeks minstens één keer voorkomt:

$ grep "lak+" file5

Hier moet de letter 'k' minstens één keer voorkomen, dus onze resultaten kunnen 'lake' of 'lakkkkk' zijn, maar niet 'la'.

?

In de volgende sjabloon is het resultaat de tekenreeks bb of bab:

$ grep "ba?b" file6

Met de opgegeven kwantor '?' we kunnen één of geen karakter hebben.

Belangrijke notitie! Laten we zeggen dat we een reguliere expressie hebben:

$ grep "S.*l" file7

En we krijgen de resultaten 'Klein', 'Dwaas' en 'Susan is een beetje balen'. Maar waarom kregen we 'Susan is een beetje balbaar' terwijl we alleen naar woorden zochten en niet naar de volledige zin?

Het punt is dat deze zin overeenkomt met onze zoekcriteria: hij begint met de letter 'S', heeft een willekeurig aantal tekens in het midden en eindigt met de letter 'l'. Dus wat kunnen we doen om onze regex te repareren, zodat we alleen woorden als uitvoer krijgen in plaats van hele zinnen.

Voeg hiervoor de kwantor '?' naar de reguliere expressie:

$ grep "S.*?l" file7

of een escape-teken

Het ''-teken wordt gebruikt wanneer het nodig is om een ​​teken op te nemen dat een metateken is of een speciale betekenis heeft voor een reguliere expressie. U wilt bijvoorbeeld alle woorden vinden die eindigen op een punt. Hiervoor kunnen we de uitdrukking gebruiken:

$ grep "S.*?." file8

Het zoekt en matcht alle woorden die eindigen op een punt.

Je hebt dus een basiskennis van hoe reguliere expressies werken. Oefen zoveel mogelijk, maak reguliere expressies en probeer ze zo vaak mogelijk in je werk op te nemen. U kunt de juistheid controleren van het gebruik van uw reguliere expressies voor een specifiek voorbeeld op een special website .

Uw cloudreis beginnen? Zet nu de eerste stap.