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 mitc
überein undcc
) und ist eine Alternative für\{0,1\}
-
\+
ein Zeichen mindestens einmal wiederholen (c\+
stimmt mitcc
überein ,cccccccc
etc.) und ist eine Alternative für\{1,\}
-
\|
wird unterstützt (z.B.grep a\|b
sucht nacha
oderb
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.