Il s'agit en fait de deux questions et elles auraient dû être séparées. Mais puisque les réponses sont relativement simples, je vais les mettre ici. Ces réponses sont pour GNU grep
spécifiquement.
a) egrep
est identique à grep -E
. Les deux indiquent que les "expressions régulières étendues" doivent être utilisées à la place de grep
les expressions régulières par défaut de . grep
nécessite les barres obliques inverses pour les expressions régulières simples.
Du man
page :
Expressions régulières de base ou étendues
Dans les expressions régulières de base, les méta-caractères ? , + , { , | , ( , et ) perdre leur sens particulier; utilisez plutôt les versions avec barre oblique inverse \? , \+ , \{ , \| , \( , et \) .
Voir le man
page pour plus de détails sur les conventions historiques et la portabilité.
b) Utilisez egrep '(.)\1{N}'
et remplacer N
par le nombre de caractères que vous souhaitez remplacer moins un (puisque le point correspond au premier). Donc, si vous voulez faire correspondre un caractère répété quatre fois, utilisez egrep '(.)\1{3}'
.
Cela rechercherait 2 occurrences ou plus du même caractère :
grep -E '(.)\1+' file
Si votre awk a l'option -o, cela l'imprimera à chaque correspondance sur une nouvelle ligne.
grep -Eo '(.)\1+' file
Pour trouver des correspondances avec exactement 3 correspondances :
grep -E '(.)\1{2}' file
Ou 3 ou plus :
grep -E '(.)\1{2,}' file
etc..
modifier
En fait @stephane_chazelas a raison sur les références arrière et -E. J'avais oublié ça. Je l'ai essayé dans BSD grep et GNU grep et cela fonctionne là-bas mais ce n'est pas dans d'autres greps. Vous devrez utiliser l'une des versions ci-dessous.
Versions normales de grep :
grep '\(.\)\1\{1,\}' file
grep -o '\(.\)\1\{1,\}' file
grep '\(.\)\1\{2\}' file
grep '\(.\)\1\{2,\}' file
Le -o
l'option n'est pas non plus standard grep BTW (probablement si votre grep comprend -o il peut aussi faire la référence arrière)..
Remarque :grep -E '(.)\1{2,}'
fichier et grep '\(.\)\1\{2\}'
fichier sont erronés comme indiqué par alexis et doivent être ignorés..
Tout d'abord, merci à tous pour vos commentaires et suggestions. Il s'avère que j'étais déjà assez proche de la réponse.
Le problème principal était d'environ :
Existe-t-il un moyen simple de rechercher n occurrences du même caractère, par ex.
aa
,tttttt
Réponse courte :
Les [variations de] commandes suivantes répéteront a
au moins une fois et à l'infini
grep 'a\{1,}
grep -E \(a\)\{1,\}
egrep a{1,}
ou, avec les expressions régulières GNU disponiblesgrep a\+
Le nombre de répétitions est défini à l'intérieur des accolades, via le modèle {min,max}
→ {n}
répéter exactement n
fois, {n,}
répéter au moins n
fois et {n,m}
répéter au moins n
mais au plus m
fois.
Ainsi, en conséquence, a soulevé la question secondaire :
La nécessité de définir des jeux est-elle liée à la commande Iuse ?
Réponse courte :Oui, l'utilisation des antislash dépend si l'on utilise grep
ou egrep
grep
:la barre oblique inverse active les métacaractères [utilise les expressions régulières de base]egrep
barre oblique inverse de -active les métacaractères [utilise des expressions régulières étendues]
Comme il s'agit de la réponse courte, je veux fournir à ceux qui ont rencontré des problèmes comparables, j'ai ajouté mon résumé de base de ce dont on doit apparemment être conscient, en travaillant avec grep
et egrep
.
Expressions régulières de base, étendues et GNU
Expressions régulières de base
Utilisé dans grep
, ed
et sed
commande
Les fonctionnalités de base des ensembles d'expressions régulières sont :
- La plupart des métacaractères, par ex.
? [ . \ )
etc. sont activés par une barre oblique inverse. S'il n'y a pas de barre oblique inverse, ils seront considérés comme (partie du) terme de recherche. ^ $ \<
et\>
sont pris en charge sans barre oblique inverse- Aucun caractère abrégé [
\b
,\s
, etc.]
GNU Les expressions régulières de base s'y ajoutent
\?
répéter le caractère zéro ou une fois (c\?
correspond àc
etcc
) et est une alternative pour\{0,1\}
-
\+
répéter un caractère au moins une fois (c\+
correspond àcc
,cccccccc
etc.) et est une alternative pour\{1,\}
-
\|
est pris en charge (par exemple,grep a\|b
chercheraa
oub
grep -E
permet à la commande d'utiliser l'ensemble des expressions régulières étendues :
Expressions régulières étendues [ERE]
Utilisé dans egrep
, awk
et emacs
est l'ensemble de base plus quelques fonctionnalités.
- Les métacaractères sont désactivés par une barre oblique inverse
- Aucune référence arrière
- autrement :une grande partie de la magie que les expressions régulières peuvent généralement faire pour une personne
GNU Étendre les expressions régulières
ajoute les fonctionnalités suivantes
- cours de sténographie
- quantificateurs
Les deux liens en dirigeront un vers regular-expressions.info qui, en plus du support formidable que j'ai ici, m'a vraiment beaucoup aidé.