varias - Cómo truncar líneas largas coincidentes devueltas por grep o ack
opciones de grep unix (5)
Puede usar la opción grep -o
, posiblemente en combinación con cambiar su patrón a ".{0,10}<original pattern>.{0,10}"
para ver el contexto a su alrededor:
-o, --only-matching Show only the part of a matching line that matches PATTERN.
..or -c
:
-c, --count Suppress normal output; instead print a count of matching lines for each input file. With the -v, --invert-match option (see below), count non-matching lines.
Quiero ejecutar ack o grep en archivos HTML que a menudo tienen líneas muy largas. No quiero ver líneas muy largas que se envuelvan repetidamente. Pero sí quiero ver solo esa parte de una línea larga que rodea una cadena que coincide con la expresión regular. ¿Cómo puedo obtener esto usando cualquier combinación de herramientas de Unix?
Puede usar menos como buscapersonas para atacar y cortar líneas largas: ack --pager="less -S"
Esto conserva la línea larga pero la deja en una línea en lugar de envolver. Para ver más de la línea, desplácese hacia la izquierda / derecha en menos con las teclas de flecha.
Tengo la siguiente configuración de alias para ack para hacer esto:
alias ick=''ack -i --pager="less -R -S"''
El enfoque sugerido ".{0,10}<original pattern>.{0,10}"
está perfectamente bien, excepto por el hecho de que el color de resaltado a menudo está en mal estado. Creé un script con un resultado similar, pero el color también se conserva:
#!/bin/bash
# Usage:
# grepl PATTERN [FILE]
# how many characters around the searching keyword should be shown?
context_length=10
# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f ''1'' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f ''2'' | wc -c)-1))
grep -E --color=always "$1" $2 |
grep --color=none -oE /
".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
Suponiendo que la secuencia de comandos se guarda como grepl
, el grepl pattern file_with_long_lines
debe mostrar las líneas correspondientes pero con solo 10 caracteres alrededor de la cadena correspondiente.
Transmite tus resultados a través del cut
. También estoy considerando agregar un --cut
para que pueda decir --cut=80
y solo obtenga 80 columnas.
cut -c 1-100
obtiene caracteres del 1 al 100.