Je recherche une expression régulière qui trouve toutes les occurrences de caractères doubles dans un texte, une liste, etc. sur la ligne de commande (Bash).
Question principale : Y at - il un moyen simple de regarder des séquences comme aa
, ll
, ttttt
, etc. où l' on définit une expression régulière qui recherche n occurences du même caractère avec? Ce que je recherche, c'est y parvenir à un niveau très très basique. Sur la ligne de commande. Dans un shell Linux.
Après de nombreuses recherches, je suis parvenu aux réponses suivantes - et aux questions qui en découlaient, donc ils m'ont juste donné un indice où la solution pourrait être. Mais:
a) (e) grep et la barre oblique inverse
grep 'a\{2\}'
cherche desaa
egrep'a{2}'
cherche desaa
Question: La nécessité de définir des backlashes est-elle vraiment liée à la commande que j'utilise? Dans l'affirmative, quelqu'un peut-il me donner un indice sur les autres éléments à prendre en compte lors de l'utilisation de (e) grep ici?
b) J'ai trouvé cette réponse ici pour ma question, bien que ce ne soit pas exactement ce que je cherchais:
grep -E '(.)\1' filename
recherche les entrées avec le même caractère apparaissant plus d'une fois mais ne demande pas à quelle fréquence . C'est proche de ce que je recherche, mais je veux quand même définir un certain nombre de répétitions.
Je devrais probablement diviser cela en deux ou plusieurs questions, mais je ne veux pas inonder ce site génial ici.
PS: Une autre question, peut - être hors sujet , mais: est - il in
, inside
, at
ou on the shell
. Et c'est on the command line
correct?
egrep
si j'ai besoin d'expressions régulières (par opposition à une simple correspondance de chaîne) afin de ne pas avoir à me souvenir des différences entregrep
les deux types d'expressions régulières.grep '\(.\)\1\{3\}'
Est donc standard,grep -E '(.)\1{3}'
n'est pas.Cela rechercherait 2 occurrences ou plus du même caractère:
Si votre awk a l'option -o, cela l'imprimerait chaque match sur une nouvelle ligne.
Pour trouver des correspondances avec exactement 3 correspondances:
Ou 3 ou plus:
etc..
Éditer
En fait, @stephane_chazelas a raison sur les références arrières 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 devez utiliser l'une des versions ci-dessous.
Versions grep régulières:
L'
-o
option n'est pas non plus standard grep BTW (probablement si votre grep comprend -o il peut également faire la référence arrière).Remarque : le
grep -E '(.)\1{2,}'
fichier et legrep '\(.\)\1\{2\}'
fichier sont incorrects comme indiqué par alexis et doivent être ignorés.la source
-E
option,grep
cela ne ferait pas grand-chose? Cela expliquerait beaucoup de choses, par exemple pourquoi j'ai perdu autant de temps à chercher où j'avais tort!+
opérateur .. Je posterai aussi des exemples.grep -E '(.)\1{2}'
ne fait pas exactement "Trouver des correspondances avec exactement 3 correspondances". Bien qu'il corresponde exactement à trois caractères identiques, ils peuvent être incorporés dans une chaîne répétée plus longue; par exemple, il correspondra dans la chaîne de 5 symbolesAAAAA
. (Et s'il y a 6 symboles consécutifs ou plus, il correspondra plus d'une fois).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 principal problème concernait:
Réponse courte :
Les [variations de] commandes suivantes se répéteront
a
au moins une fois et à l'infinigrep 'a\{1,}
grep -E \(a\)\{1,\}
egrep a{1,}
ou, avec les expressions régulières GNU disponibles
grep a\+
Le nombre de répétitions est défini à l'intérieur des accolades, à travers le motif
{min,max}
→{n}
répéter exactement desn
fois,{n,}
répéter au moinsn
fois et{n,m}
répéter au moinsn
mais au plusm
souvent.Ainsi, en conséquence, a soulevé la question secondaire :
Réponse courte : Oui, l'utilisation de barres obliques inverses dépend de si l'on utilise
grep
ouegrep
grep
: la barre oblique inverse active les métacaractères [utilise les expressions régulières de base]egrep
backslash de -activates métacaractères [utilisations expressions rationnelles]Comme c'est 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 que l'on doit apparemment savoir, travailler avec
grep
etegrep
.Expressions régulières de base, étendues et GNU
Expressions régulières de base
Utilisé dans
grep
,ed
etsed
commandeLes fonctionnalités de base des expressions régulières sont:
? [ . \ )
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 (faisant partie du) terme de recherche.^ $ \<
et\>
sont pris en charge sans barre oblique inverse\b
,\s
etc.]Les expressions régulières de base GNU s'ajoutent à celles-ci
\?
caractère répétition zéro ou une fois (c\?
matchsc
etcc
) et est une alternative pour\{0,1\}
\+
répéter un caractère au moins une fois (c\+
correspondancescc
,cccccccc
etc.) et est une alternative pour\{1,\}
\|
est pris en charge (par exemplegrep a\|b
rechercheraa
oub
grep -E
permet à la commande d'utiliser l'ensemble complet des expressions régulières étendues:Expressions régulières étendues [ERE]
Utilisé dans
egrep
,awk
etemacs
est l'ensemble de base, ainsi que de nombreuses fonctionnalités.GNU Extendend Expressions régulières
ajoute les fonctionnalités suivantes
Les deux liens en dirigeront un vers regular-expressions.info qui, en plus du support impressionnant que j'ai ici, m'a vraiment beaucoup aidé.
la source