Utilisation du signe étoile dans grep

J'essaie de rechercher la sous-chaîne " abc " dans un fichier spécifique dans linux / bash

Donc je fais:

grep '*abc*' myFile

Il ne retourne rien.

Mais si je le fais:

grep 'abc' myFile

Il renvoie les correspondances correctement.

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 l'accomplir en utilisant grep?

53
demandé sur Saobi 2009-07-01 18:06:58

10 réponses

L'astérisque est juste 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 second * est sur le c; le premier n'a pas de sens car 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 (dans certaines lignes directrices). Si vous voulez juste faire correspondre abc, vous pouvez simplement dire grep 'abc' myFile. Pour votre correspondance plus complexe, vous devez utiliser .* -- {[4] } correspondra à une chaîne qui contient abc suivi de def avec quelque chose éventuellement entre les deux.

Mise à Jour basé 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 caractère générique (par exemple ls *.log listera tous les fichiers qui se terminent par .journal). Cependant, dans les expressions régulières, * est un modificateur, ce qui signifie qu'il ne s'applique qu'au caractère ou au groupe le précédant. 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; ie. trouver un ou plusieurs de n'importe quel caractère.

78
répondu Daniel Vandersluis 2010-08-23 19:58:21

Le caractère dot signifie correspondre à n'importe quel caractère, donc '.* "signifie zéro ou plusieurs occurrences de tout caractère. Tu veux sans doute dire à utiliser.* 'plutôt que juste'*'.

Ah, Merde,

14
répondu smcameron 2009-07-01 14:12:56

Le "signe d'étoile" 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
9
répondu Jonathan Leffler 2009-07-01 14:20:39

L'expression que vous avez essayée, comme celles qui fonctionnent sur la ligne de commande shell sous Linux par exemple, s'appelle "glob ". Les expressions Glob ne sont pas complètes Les expressions régulières, ce que grep utilise pour spécifier les chaînes à rechercher. Ici est (vieux, 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 globs en REs, mais vous devez généralement le faire dans votre tête.

4
répondu unwind 2009-07-01 14:17:59

Vous n'utilisez pas d'expressions régulières, donc votre variante grep de choix devrait être fgrep, qui se comportera comme vous l'attendez.

4
répondu Andrew Beals 2012-02-01 15:23:30

Utilisez grep - P-qui permet la prise en charge des expressions régulières de style Perl.

grep -P "abc.*def" myfile
3
répondu Artem Russakovskii 2009-07-01 14:14:26

Essayez grep-E pour la prise en charge des expressions régulières étendues

Jetez également un oeil à:

La page de manuel de grep

2
répondu Brian 2009-07-01 14:09:05

Cela peut être la réponse que vous cherchez:

grep abc MyFile | grep def

La seule chose est... il va sortir les lignes étaient "def" est avant ou après " abc "

1
répondu Charles Duke 2015-10-21 05:21:33

'*' fonctionne comme un modificateur pour l'élément précédent. Donc, 'abc * def' recherche 'ab' suivi de 0 ou plus 'c' suivi de 'def'.

Ce que vous voulez probablement est ' abc.* def 'qui recherche' abc 'suivi d'un nombre quelconque de caractères, suivi de 'def'.

0
répondu Conspicuous Compiler 2009-07-01 14:11:48

Cela a fonctionné pour moi:

Grep ".* ${expr} " - avec des guillemets doubles, précédés du point, grep standard sans commutateurs supplémentaires.

0
répondu access_granted 2018-09-27 00:45:13