GNU/Linux >> Tutoriels Linux >  >> Linux

Expression régulière pour trouver des caractères doubles dans Bash

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 et cc ) 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 cherchera a ou b

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é.


Linux
  1. Bash + Vérifier le nom par expression régulière ?

  2. les bases de grep

  3. 6 Exemples d'expressions conditionnelles Bash ( -e, -eq, -z, !=, [, [[ ..)

  4. Comment utiliser l'anticipation pour exclure les caractères spéciaux dans une expression régulière

  5. Problème(s) d'expression régulière dans Bash :[^negate] ne semble pas fonctionner

Bash pour la boucle

Expression de séquence bash (plage)

Expressions régulières dans Grep (Regex)

Comment Grep pour plusieurs chaînes et modèles

Tutoriel de script Bash pour les débutants

Tutoriel Bash Heredoc pour les débutants