J'essaye de rechercher la sous-chaîne "abc" dans un fichier spécifique sous linux / bash
Moi aussi:
grep '*abc*' myFile
Il ne renvoie rien.
Mais si je fais:
grep 'abc' myFile
Il renvoie correctement les correspondances.
Maintenant, ce n'est pas un problème pour moi. Mais que faire si je veux grep pour une chaîne plus complexe, disons
*abc * def *
Comment pourrais-je y parvenir en utilisant grep?
*
signifie la même chose dans grep et egrep: c'est un quantificateur signifiant zéro ou plus de l'atome précédent. C'est un concept complètement différent des caractères génériques utilisés par le shell.Réponses:
L'astérisque n'est qu'un opérateur de répétition , mais vous devez lui dire ce que vous répétez.
/*abc*/
correspond à une chaîne contenant ab et zéro ou plus de c (parce que le deuxième * est sur le c; le premier n'a pas de sens parce qu'il n'y a rien à répéter). Si vous voulez faire correspondre quelque chose, vous devez dire.*
- le point signifie n'importe quel caractère ( selon certaines directives ). Si vous voulez simplement faire correspondre abc, vous pouvez simplement diregrep 'abc' myFile
. Pour votre correspondance plus complexe, vous devez utiliser.*
-grep 'abc.*def' myFile
correspondra à une chaîne contenant abc suivie de def avec quelque chose éventuellement entre les deux.Mise à jour basée sur un commentaire:
*
dans une expression régulière n'est pas exactement la même chose que * dans la console. Dans la console, * fait partie d'une construction glob , et agit simplement comme un joker (par exemplels *.log
, listera tous les fichiers qui se terminent par .log). Cependant, dans les expressions régulières, * est un modificateur, ce qui signifie qu'il s'applique uniquement au caractère ou au groupe qui le précède. Si vous voulez que * dans les expressions régulières agisse comme un caractère générique, vous devez utiliser.*
comme mentionné précédemment - le point est un caractère générique, et l'étoile, lors de la modification du point, signifie trouver un ou plusieurs points; c'est à dire. trouver un ou plusieurs de n'importe quel caractère.la source
*
signifie "0 ou plus", et grep est gourmand par défaut. Notez que dans grep base des expressions régulières les métacaractères?
,+
,{
,|
,(
et)
perdent leur signification particulière. Plus d'informations: grep regexpsLe caractère point signifie correspondre à n'importe quel caractère, donc
.*
zéro ou plusieurs occurrences de n'importe quel caractère. Vous voulez probablement utiliser.*
plutôt que simplement*
.la source
Le "signe astrologique" n'a de sens que s'il y a quelque chose devant lui. S'il n'y a pas l'outil (grep dans ce cas) peut simplement le traiter comme une erreur. Par exemple:
'*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz
la source
Utilisez grep -P - qui active la prise en charge des expressions régulières de style Perl.
grep -P "abc.*def" myfile
la source
L'expression que vous avez essayée, comme celles qui fonctionnent sur la ligne de commande du shell sous Linux par exemple, s'appelle un " glob ". Les expressions globales ne sont pas des expressions régulières complètes , ce que grep utilise pour spécifier les chaînes à rechercher. Voici un (ancien, petit) post sur les différences. Les expressions glob (comme dans "ls *") sont interprétées par le shell lui-même.
Il est possible de traduire des globes en RE, mais vous devez généralement le faire dans votre tête.
la source
Vous n'utilisez pas d'expressions régulières, donc la variante grep de votre choix devrait être
fgrep
, qui se comportera comme vous l'attendez.la source
fgrep
est désormais obsolète,grep -f
doit être utilisé à la place.Essayez grep -E pour une prise en charge étendue des expressions régulières
Jetez également un œil à:
La page de manuel grep
la source
C'est peut-être la réponse que vous recherchez:
La seule chose est que ... il affichera les lignes où "def" est avant OU après "abc"
la source
Cela a fonctionné pour moi:
grep ". * $ {expr}" - avec des guillemets doubles, précédés du point. Où "expr" est la chaîne dont vous avez besoin à la fin de la ligne.
Grep unix standard sans commutateurs supplémentaires.
la source
'*' fonctionne comme un modificateur pour l'élément précédent. Donc 'abc * def' recherche 'ab' suivi de 0 ou plus de 'c suivis de' def '.
Ce que vous voulez probablement, c'est "abc. * Def" qui recherche "abc" suivi d'un nombre quelconque de caractères, suivi de "def".
la source