2017-10-18 17 views
0

Bonjour, je veux savoir comment grep lignes qui ont un mot répété deux fois de suite. Un espace entre les deux mots doit évidemment être pris en compte et il doit être sensible à la casse qui, je crois, est naturellement.comment grep ou egrep mots qui apparaissent deux fois d'affilée?

Je ne veux pas seulement une réponse plutôt que je veux savoir comment le faire et le comprendre. Donc, quiconque répond peut vous expliquer s'il vous plaît ce que la ligne dit ou ce que le modèle est en train de faire. J'ai une compréhension de base à intermédiaire sur grep et bash mais en apprenant toujours toutes les subtilités de grep et la syntaxe de corrélation. Toute aide serait grandement appréciée.

C'est aussi proche que je ne l'ai pas obtenu lol mais je suis pas sûr de ce qu'est exactement que je fais ici ...

grep '.*\|.*\| ' 

Merci à tous !! À la votre!

Répondre

0

Vous utiliseriez grep -E '(\<[^[:blank:]]+\>).*\1'

Le \< et \> représentent des limites de mots. Avec la séquence de caractères non vierges, cela forme un seul mot. Ensuite, le \1 rappelle ce premier ensemble de parenthèses de capture.

+0

Malheureusement, de nombreux outils utilisent des saveurs légèrement différentes d'expressions régulières. Les expressions rationnelles pour les outils GNU (grep, awk, etc) peuvent être trouvées sur https://www.gnu.org/software/gnulib/manual/html_node/Regular-expression-syntaxes.html#Regular-expression-syntaxes –

0

\ 1 correspond à chaque chaîne correspondant à la première chaîne trouvée. Ce n'est pas la même chose que de faire correspondre le même modèle qui a été apparié par la première chaîne. Ainsi, la première capture correspondant à une limite de mot n'est plus pertinente, même si \ b est à l'intérieur des parenthèses de capture.

Si vous voulez que la deuxième instance soit aussi sur une limite de mot, alors vous devez le dire. De plus, en utilisant des expressions régulières, nous pouvons dire que nous voulons tous les petits mots AZ et les grands mots AZ. En outre, en utilisant le signe +, nous disons que les caractères précédents correspondent au moins 1 fois ou plus.

egrep "(\b[a-zA-Z]+) \1\b" file.txt 

Ceci vous montrera tous les mots qui sont utilisés deux fois.

grep -E "(\b[a-zA-Z]+) \1\b" file.txt 

Cette commande fonctionnera également si vous préférez utiliser grep. grep -E signifie qu'il utilise des expressions régulières étendues. Donc, c'est la même chose que egrep.