grep che circonda i personaggi di una partita


8

Sto cercando di trovare e sostituire all'interno di un gigantesco dump di database, e non sta facendo quello che penso dovrebbe accadere. Vorrei grep per la mia stringa di destinazione nel file, quindi vedere gli 8 caratteri circostanti (potrebbe essere necessario modificare quel numero, a seconda). Come lo posso fare?

Il motivo per cui non riesco a vedere questo è perché ci sono molte centinaia, se non migliaia di partite. Voglio ottenere un certo numero di caratteri che circondano la stringa, quindi inserirla uniqo qualcosa del genere per capire perché la mia ricerca e sostituzione comporta comportamenti inaspettati.

Inoltre, ci possono essere più corrispondenze sulla stessa riga!


Non è un file di testo?
enzotib,

Lo è, ma anche solo le partite sono un file troppo grande per il bulbo oculare.
user394

Risposte:


12

Il modo rozzo di usare grepsarebbe qualcosa di simile

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

Il numero di punti corrisponde al numero di caratteri prima / dopo il testo grepped. L' -oopzione rende in grepoutput solo le corrispondenze, non le intere righe.

Per utilizzare uniql'output, ricorda che devi prima ordinare l'output. Quindi, in genere, lo faresti

grep . . . | sort | uniq

Se sei interessato all'hitcount per ogni partita, puoi ottenere un buon risultato usando

grep . . . | sort | uniq -c | sort -n

Greggio? Completamente sofisticato!
user394

1
Si potrebbe espandere su questo un po 'utilizzando l'operatore di ripetizione: grep -o '.\{8\}yourtext.\{8\}'. Questo è un po 'meno vertiginoso rispetto al conteggio di 8 punti.
Caleb,

:) Per rozzo intendo che non giochi con cose come contare i personaggi abbinati (usando gli intervalli) o restringere i set di caratteri.
rozcietrzewiacz,

@Caleb e user394: Questo è esattamente ciò che intendevo non suggerire (e quindi ho chiamato il mio metodo "grezzo"). Non è necessario ricordare il costrutto dell'operatore di ripetizione, inoltre - è ancora più veloce digitare "....." di ". \ {6 \}".
rozcietrzewiacz,

7

A partire dalla risposta di @rozcietrzewiacz, posso espandermi a

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
La sequenza di punti "grezzi" sembra sempre migliore :)
Caleb

1
@Caleb: generalmente la risposta "grezza" è un buon inizio, ma a volte si vuole approfondire un po '.
enzotib,

1
Il metodo della sequenza punti non troverà modelli target giustificati a sinistra o a destra; questo metodo lo farà. (+1)
Peter

2
PS .. Ho appena notato che non catturerà più istanze di pattern sulla stessa riga (come menzionato dall'OP) quando l'ambito del testo finale "exta" del primo modello si sovrappone all'ambito del testo "extra" iniziale del prossimo modello
Peter.O

@fred: sì, -odà solo la prima partita quando due partite si sovrappongono:echo 'aaabbbccc' | grep -o 'bb
enzotib
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.