Het sterrenbeeld in grep gebruiken

Ik probeer te zoeken naar de substring “abc” in een specifiek bestand in linux/bash

Dus ik doe:

grep '*abc*' myFile

Het levert niets op.

Maar als ik dat doe:

grep 'abc' myFile

Het geeft de juiste resultaten terug.

Dit is geen probleem voor mij. Maar wat als ik naar een complexere string wil grijpen, zeg

*abc * def *

Hoe zou ik dit bereiken met grep?


Antwoord 1, autoriteit 100%

Het sterretje is slechts een herhalingsoperator, maar je moet wel aangeven wat je herhalen. /*abc*/ komt overeen met een string die ab en nul of meer c’s bevat (omdat de tweede * op de c staat; de eerste is zinloos omdat er niets is om te herhalen). Als je iets wilt matchen, moet je .* zeggen — de punt betekent een willekeurig teken (binnen bepaalde richtlijnen). Als je alleen abc wilt matchen, kun je gewoon grep 'abc' myFile zeggen. Voor uw meer complexe overeenkomst, moet u .* gebruiken — grep 'abc.*def' myFile zal overeenkomen met een tekenreeks die abc bevat gevolgd door def met iets optioneel in tussen.

Update op basis van een opmerking:

* in een reguliere expressie is niet precies hetzelfde als * in de console. In de console maakt * deel uit van een glob-constructie en fungeert het alleen als een jokerteken (bijvoorbeeld ls *.log zal alle bestanden weergeven die eindigen op .log). In reguliere expressies is * echter een modifier, wat betekent dat het alleen van toepassing is op het teken of de groep die eraan voorafgaat. Als je wilt dat * in reguliere expressies als een jokerteken fungeert, moet je .* gebruiken zoals eerder vermeld — de punt is een jokerteken en de ster, wanneer de punt wordt gewijzigd, betekent er een vinden of meer stip; d.w.z. vind een of meer karakters.


Antwoord 2, autoriteit 21%

Het puntteken betekent dat elk teken overeenkomt, dus .* betekent nul of meer voorkomens van elk teken. Je bedoelt waarschijnlijk .* te gebruiken in plaats van alleen *.


Antwoord 3, autoriteit 9%

Het ‘sterrenbeeld’ heeft alleen betekenis als er iets voor staat. Als er geen tool is (grep in dit geval) kan het gewoon als een fout worden beschouwd. Bijvoorbeeld:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

Antwoord 4, autoriteit 7%

Gebruik grep -P – waarmee ondersteuning voor reguliere expressies in Perl-stijl mogelijk is.

grep -P "abc.*def" myfile

Antwoord 5, autoriteit 4%

De uitdrukking die je hebt geprobeerd, zoals de uitdrukking die bijvoorbeeld op de shell-opdrachtregel in Linux werkt, heet een “glob“. Glob-expressies zijn niet vol reguliere expressies, wat grep gebruikt om strings op te geven waarnaar moet worden gezocht. Hier is een (oud, klein) bericht over de verschillen. De glob-expressies (zoals in “ls *”) worden geïnterpreteerd door de shell zelf.

Het is mogelijk om van globs naar RE’s te vertalen, maar je moet dit meestal in je hoofd doen.


Antwoord 6, autoriteit 3%

Je gebruikt geen reguliere expressies, dus je grep-variant moet fgrep zijn, die zich zal gedragen zoals je verwacht.


Antwoord 7, autoriteit 2%

Probeer grep -E voor uitgebreide ondersteuning van reguliere expressies

Kijk ook eens naar:

De grep-manpagina


Antwoord 8

‘*’ werkt als een modifier voor het vorige item. Dus ‘abc*def’ zoekt naar ‘ab’ gevolgd door 0 of meer ‘c’s gevolgd door ‘def’.

Wat u waarschijnlijk zoekt is ‘abc.*def’ dat zoekt naar ‘abc’ gevolgd door een willekeurig aantal tekens, gevolgd door ‘def’.


Antwoord 9

Dit is misschien het antwoord dat u zoekt:

grep abc MyFile | grep def

Het enige is… het zal regels uitvoeren waar “def” voor OF na “abc” staat


Antwoord 10

Dit werkte voor mij:

grep “.*${expr}” – met dubbele aanhalingstekens, voorafgegaan door de punt.
Waar “expr” de string is die je nodig hebt aan het einde van de regel.

Standaard Unix grep zonder extra schakelaars.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

5 × 4 =

Other episodes