GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Regulärer Ausdruck zum Auffinden doppelter Zeichen in Bash

Das sind wirklich zwei Fragen und hätten getrennt werden sollen. Aber da die Antworten relativ einfach sind, stelle ich sie hier. Diese Antworten gelten für GNU grep speziell.

a) egrep ist dasselbe wie grep -E . Beide geben an, dass anstelle von grep "Extended Regular Expressions" verwendet werden sollten die standardmäßigen regulären Ausdrücke von . grep erfordert die umgekehrten Schrägstriche für einfache reguläre Ausdrücke.

Aus dem man Seite:

Einfache vs. erweiterte reguläre Ausdrücke

In einfachen regulären Ausdrücken sind die Metazeichen ? , + , { , | , ( , und ) verlieren ihre besondere Bedeutung; Verwenden Sie stattdessen die Backslash-Versionen \? , \+ , \{ , \| , \( , und \) .

Siehe man Seite für weitere Details zu historischen Konventionen und Portabilität.

b) Verwenden Sie egrep '(.)\1{N}' und ersetzen Sie N mit der Anzahl der Zeichen, die Sie ersetzen möchten, minus eins (da der Punkt mit dem ersten übereinstimmt). Wenn Sie also ein viermal wiederholtes Zeichen finden möchten, verwenden Sie egrep '(.)\1{3}' .


Dies würde nach 2 oder mehr Vorkommen desselben Zeichens suchen:

grep -E '(.)\1+' file

Wenn Ihr awk die Option -o hat, würde dies jede Übereinstimmung in einer neuen Zeile ausgeben..

grep -Eo '(.)\1+' file

So finden Sie Übereinstimmungen mit genau 3 Übereinstimmungen:

grep -E '(.)\1{2}' file

Oder 3 oder mehr:

grep -E '(.)\1{2,}' file

usw..

bearbeiten

Eigentlich hat @stephane_chazelas Recht mit Rückverweisen und -E. Das hatte ich vergessen. Ich habe es in BSD grep und GNU grep ausprobiert und es funktioniert dort, aber es ist nicht in einigen anderen greps. Sie müssten eine der folgenden Versionen verwenden..

Reguläre grep-Versionen:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

Die -o Die Option ist übrigens auch kein standardmäßiges grep (wahrscheinlich, wenn Ihr grep -o versteht, kann es auch die Rückreferenz ausführen)..

Hinweis :grep -E '(.)\1{2,}' Datei und grep '\(.\)\1\{2\}' Datei sind, wie von Alexis angegeben, falsch und sollten ignoriert werden..


Zunächst danke ich Ihnen allen für Ihre unterstützenden Kommentare und Vorschläge. Wie sich herausstellte, war ich der Antwort schon ziemlich nahe.

Das Hauptproblem war ungefähr:

Gibt es eine einfache Möglichkeit, nach n zu suchen Vorkommen des gleichen Zeichens, z.B. aa , tttttt

Kurze Antwort :

Die folgenden [Variationen von] Befehlen wiederholen a mindestens einmal und unendlich oft

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

oder, mit verfügbaren regulären GNU-Ausdrückengrep a\+


Die Anzahl der Wiederholungen wird innerhalb der geschweiften Klammern durch das Muster {min,max} festgelegt → {n} wiederholen Sie genau n Mal, {n,} wiederholen Sie mindestens n mal und {n,m} wiederholen Sie mindestens n aber höchstens m Mal.

Als Folge davon wurde das sekundäre Problem aufgeworfen :

Ist die Notwendigkeit Backlashes an den Befehl Iuse?

gebunden

Kurze Antwort :Ja, die Verwendung von Backslashes hängt davon ab, ob man grep verwendet oder egrep

  • grep :Backslash aktiviert Metazeichen [verwendet grundlegende reguläre Ausdrücke]
  • egrep Backslash de -aktiviert Metazeichen [verwendet erweiterte reguläre Ausdrücke]

Da dies die kurze Antwort ist, die ich denen geben möchte, die auf ähnliche Probleme gestoßen sind, habe ich meine grundlegende Zusammenfassung dessen hinzugefügt, was man anscheinend beachten muss, wenn man mit grep arbeitet und egrep .



Einfache, erweiterte und reguläre GNU-Ausdrücke

Grundlegende reguläre Ausdrücke

Verwendet in grep , ed und sed Befehl

Grundlegende Funktionen des Satzes regulärer Ausdrücke sind:

  • Die meisten Metazeichen, z.B. ? [ . \ ) etc. werden durch einen Backslash aktiviert. Wenn kein Backslash vorhanden ist, werden sie als (Teil des) Suchbegriffs verwendet.
  • ^ $ \< und \> werden ohne Backslash
  • unterstützt
  • Keine Kurzzeichen [\b , \s usw.]

GNU Grundlegende reguläre Ausdrücke ergänzen diese

  • \? Zeichen null oder einmal wiederholen (c\? stimmt mit c überein und cc ) und ist eine Alternative für \{0,1\}
  • \+ ein Zeichen mindestens einmal wiederholen (c\+ stimmt mit cc überein , cccccccc etc.) und ist eine Alternative für \{1,\}

  • \| wird unterstützt (z.B. grep a\|b sucht nach a oder b

grep -E ermöglicht dem Befehl, den gesamten Satz der erweiterten regulären Ausdrücke zu verwenden:


Erweiterte reguläre Ausdrücke [ERE]

Verwendet in egrep , awk und emacs ist das Basic Set plus einige Features.

  • Metazeichen werden durch einen Backslash deaktiviert
  • Keine Rückverweise
  • sonst:Vieles von dem, was die magischen regulären Ausdrücke normalerweise für einen tun können

GNU Reguläre Ausdrücke erweitern

fügt die folgenden Funktionen hinzu

  • Kurzschriftklassen
  • Quantifizierer

Die beiden Links führen zu regular-expressions.info, was mir neben der großartigen Unterstützung, die ich hier bekomme, wirklich sehr geholfen hat.


Linux
  1. Tr Analog für Unicode-Zeichen?

  2. Die Definition eines regulären Ausdrucks?

  3. grep-Grundlagen

  4. Bash für Schleifenbeispiele

  5. So invertieren Sie einen grep-Ausdruck

Bash für Schleife

Bash-Sequenzausdruck (Bereich)

Reguläre Ausdrücke in Grep (Regex)

Wie man nach mehreren Zeichenfolgen und Mustern grep

Bash-Scripting-Tutorial für Anfänger

Bash Heredoc-Tutorial für Anfänger