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:
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.