grep personajes circundantes de un partido

8

Estoy buscando encontrar y reemplazar dentro de un volcado de base de datos gigante, y no está haciendo lo que creo que debería suceder. Me gustaría buscar mi cadena de destino en el archivo y luego ver los 8 caracteres circundantes más o menos (es posible que deba ajustar ese número, dependiendo). ¿Cómo puedo hacer eso?

La razón por la que no puedo mirar esto es porque hay muchos cientos, si no miles de partidos. Quiero obtener una cierta cantidad de caracteres que rodean la cadena, y luego canalizarla uniqo algo para ver por qué mi búsqueda y reemplazo tiene comportamientos inesperados.

Además, ¡puede haber múltiples coincidencias en la misma línea!

usuario394
fuente
¿No es un archivo de texto?
enzotib
Lo es, pero incluso los partidos son un archivo demasiado grande para el globo ocular.
user394

Respuestas:

12

La forma cruda de usar grepsería algo como

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

El número de puntos corresponde al número de caracteres antes / después del texto agrupado. La -oopción hace que la grepsalida solo coincida, no las líneas completas.

Para usar uniqen la salida, recuerde que primero debe ordenar la salida. Por lo general, lo harías

grep . . . | sort | uniq

Si está interesado en el recuento de visitas para cada partido, puede obtener una buena salida utilizando

grep . . . | sort | uniq -c | sort -n
rozcietrzewiacz
fuente
¿Crudo? Completamente sofisticado!
user394
1
Se podría ampliar esto un poco usando el operador de repetición: grep -o '.\{8\}yourtext.\{8\}'. Esto es un poco menos vertiginoso que contar 8 puntos.
Caleb
:) Por crudo quiero decir que no juegas con cosas como contar personajes coincidentes (usando rangos) o reducir los conjuntos de caracteres.
rozcietrzewiacz
@Caleb y user394: Esto es exactamente lo que pretendía no sugerir (y por eso llamé a mi método "crudo"). Además, no es necesario recordar la construcción del operador de repetición: es aún más rápido escribir "....." que ". \ {6 \}".
rozcietrzewiacz
7

A partir de la respuesta de @rozcietrzewiacz, puedo expandirme a

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file
enzotib
fuente
1
La secuencia de puntos "cruda" se ve mejor y mejor todo el tiempo :)
Caleb
1
@Caleb: en general, la respuesta "cruda" es un buen comienzo, pero a veces uno quiere dar un poco más de detalle.
enzotib
1
El método de secuencia de puntos no encontrará patrones de destino justificados a izquierda o derecha; Este método lo hará. (+1)
Peter.O
2
PD: acabo de notar que no capturará múltiples instancias de patrón en la misma línea (como mencionó el OP) cuando el alcance del texto 'exta' final del primer patrón se superpone al alcance del texto 'extra' inicial del siguiente patrón
Peter
@fred: sí, -oda solo el primer partido cuando se superponen dos partidos:echo 'aaabbbccc' | grep -o 'bb
enzotib