grep umgebende Charaktere eines Matches

8

Ich möchte in einem riesigen Datenbank-Dump suchen und ersetzen, und es tut nicht das, was meiner Meinung nach passieren sollte. Ich möchte nach meiner Zielzeichenfolge in der Datei suchen und dann die umgebenden 8 Zeichen oder so sehen (je nach Bedarf muss ich diese Zahl möglicherweise anpassen). Wie kann ich das machen?

Der Grund, warum ich das nicht sehen kann, ist, dass es viele Hunderte, wenn nicht Tausende von Übereinstimmungen gibt. Ich möchte eine bestimmte Anzahl von Zeichen erhalten, die die Zeichenfolge umgeben, und sie dann in uniqoder etwas weiterleiten, um zu sehen, warum mein Suchen und Ersetzen unerwartete Verhaltensweisen aufweist.

Es kann auch mehrere Übereinstimmungen in derselben Zeile geben!

user394
quelle
Es ist keine Textdatei?
Enzotib
Es ist so, aber selbst die Streichhölzer sind zu groß für einen Augapfel.
user394

Antworten:

12

Die grobe Art zu benutzen grepwäre so etwas wie

grep -o "....yourtext...." /path/to/the/dump.sql

Die Anzahl der Punkte entspricht der Anzahl der Zeichen vor / nach dem begriffenen Text. Mit dieser -oOption grepwerden nur die Übereinstimmungen ausgegeben, nicht die gesamten Zeilen.

Zur Verwendung uniqam Ausgang, erinnern Sie sich die Ausgabe zuerst zu sortieren haben. Normalerweise würden Sie das tun

grep . . . | sort | uniq

Wenn Sie an der Trefferzahl für jedes Spiel interessiert sind, können Sie mit eine schöne Ausgabe erhalten

grep . . . | sort | uniq -c | sort -n
rozcietrzewiacz
quelle
Roh? Äußerst raffiniert!
user394
1
Sie können dies ein wenig erweitern, indem Sie den Wiederholungsoperator verwenden : grep -o '.\{8\}yourtext.\{8\}'. Dies ist etwas weniger schwindelerregend als das Zählen von 8 Punkten.
Caleb
:) Mit roh meine ich, dass Sie nicht mit Dingen wie dem Zählen übereinstimmender Zeichen (unter Verwendung von Bereichen) oder dem Eingrenzen der Zeichensätze spielen.
Rozcietrzewiacz
@Caleb und user394: Genau das wollte ich nicht vorschlagen (und nannte meine Methode daher "roh"). Außerdem muss man sich nicht an das Konstrukt des Wiederholungsoperators erinnern - es ist sogar noch schneller, "....." als ". \ {6 \}" einzugeben.
Rozcietrzewiacz
7

Ausgehend von der Antwort von @rozcietrzewiacz kann ich auf erweitern

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file
Enzotib
quelle
1
Die "rohe" Punktsequenz sieht immer besser aus :)
Caleb
1
@Caleb: Im Allgemeinen ist die "grobe" Antwort ein guter Anfang, aber manchmal möchte man ein wenig darauf eingehen.
Enzotib
1
Die Punktsequenzmethode findet keine links- oder rechtsbündigen Zielmuster. Diese Methode wird. (+1)
Peter.O
2
PS .. Ich habe gerade bemerkt, dass es nicht mehrere Musterinstanzen in derselben Zeile abfängt (wie im OP erwähnt), wenn der Umfang des nachfolgenden 'exta'-Textes des ersten Musters den Umfang des führenden' zusätzlichen 'Textes überlappt des nächsten Musters
Peter.O
@fred: Ja, -ogibt nur das erste Spiel, wenn sich zwei Spiele überschneiden:echo 'aaabbbccc' | grep -o 'bb
Enzotib