grep pour une chaîne alphanumérique de n'importe quelle longueur avec deux points de chaque côté

14

Comment voulez-vous rechercher des chaînes alphanumériques de 1 à 50 caractères (idéalement, n'importe quelle longueur fonctionnerait aussi) avec deux points de chaque côté - un résultat typique serait toutes les lignes contenant la chaîne :shopping:. Jusqu'à présent, j'ai le code ci-dessous (j'ai essayé quelques variantes) qui ne fonctionne pas:

grep ':[[:alnum:]]{1,100}:' ~/x.txt

la source
Il vous suffit d'activer les capacités de regex étendues grepen incluant le -Ecommutateur.
slm

Réponses:

13

Vous devez activer les expressions régulières étendues pour cela:

grep -E ':[[:alnum:]]+:' ~/x.txt
Joseph R.
la source
4

Avec les expressions régulières de base, vous pouvez l'écrire comme:

grep ':[[:alnum:]]\{1,100\}:' ~/x.txt

Notez que \{(par opposition à \+ou \?par exemple) est standard et portable, et en fait les équivalents BRE de +et ?sont généralement écrits avec \{: \{1,\}et \{0,1\}. grep -Eest également standard et portable, vous pouvez donc aussi bien l'utiliser car il rend les expressions rationnelles plus lisibles dans ces cas.

Stéphane Chazelas
la source
1

Vous utilisez une expression régulière étendue, vous devez donc utiliser l'option -E:

grep -E ':[[:alnum:]]{1,100}:' ~/x.txt
Msegade
la source
Merci! J'ai mis l'autre réponse comme correcte parce que je n'ai pas écrit mon script "idéal" dans le titre, et je ne veux pas que les gens qui recherchent une réponse sur Google copient-collent la mauvaise réponse, mais je vais utiliser la vôtre. :)
1
@TorThommesen - vous pouvez modifier le titre de votre Q s'il n'est pas correct.
slm
0

Puisque personne d'autre ne l'a mentionné, vous pouvez également utiliser egrepce qui, si je comprends bien, est équivalent à grep -E.

egrep ':[[:alnum:]]{1,100}:' ~/x.txt
sherrellbc
la source
1
egrepétait la commande historique de grep avec les ERE. Les fonctionnalités de grep et egrep ont depuis (depuis longtemps) été fusionnées dans grep avec l'option -E. egrepest désormais considéré comme obsolète / obsolète (mais il est peu probable qu'il y aille car certaines personnes y sont encore habituées).
Stéphane Chazelas