Formatear la salida de grep al hacer coincidir varios archivos

Formatear la salida de grep al hacer coincidir varios archivos

Al buscar en varios archivos, la salida de grep se parece a esta:

{FILE}:{MATCH}

Esto es un problema ya que si hago doble clic en la {FILE}parte, al menos también seleccionaré (y copiaré) la :coincidencia y posiblemente parte de ella. ¿Cómo puedo hacer que grep formatee su salida de esta manera?

{FILE} : {MATCH}

Básicamente, quiero insertar un espacio antes de la columna. (y opcionalmente uno después)

Respuesta1

grep -Tfuncionará 7/8 del tiempo.

% for f in a ab abc abcd abcde abcdef abcdefg abcdefgh; do echo pattern > $f; done
% grep -T pattern *
a      :pattern
ab     :pattern
abc    :pattern
abcd   :pattern
abcde  :pattern
abcdef :pattern
abcdefg:pattern
abcdefgh       :pattern

Desde elmanual de grep de gnu:

-T --initial-tab

Asegúrese de que el primer carácter del contenido de la línea real se encuentre en una tabulación, para que la alineación de las tabulaciones parezca normal. Esto es útil con opciones que anteponen su salida al contenido real: -H, -ny -b. Para mejorar la probabilidad de que las líneas de un solo archivo comiencen todas en la misma columna, esto también hace que el número de línea y el desplazamiento de bytes (si está presente) se impriman en un ancho de campo de tamaño mínimo.

Respuesta2

grepHasta donde yo sé, esto no se puede hacer por sí solo. Suponiendo que sus nombres de archivos no tengan un ::

grep ... | sed 's/:/ : /'

:Sólo se rellenará el primero .

Por supuesto, puede indicarle grepque solo imprima los nombres de los archivos:

grep -l ...

Respuesta3

¿Qué constituye unpalabraen lo que respecta a la selección con doble clic, depende del terminal (y/o del kit de herramientas X) y, para algunos terminales, es personalizable.

Para xterm,Los personajes están organizados enclases(letras, espacios...) y al hacer doble clic se seleccionan caracteres adyacentes de la misma clase.

El valor predeterminado se describeallá. En ese defecto, :esnoen la misma clase que /él mismo, no en la misma clase que letras o dígitos.

Algunos sistemas cambian ese valor predeterminado al proporcionar unarchivo de recursospor xtermme gusta /etc/X11/app-defaults/XTerm.

En un sistema Linux Mint, allí encuentro:

! Here is a pattern that is useful for double-clicking on a URL:
*charClass: 33:48,35:48,37-38:48,43-47:48,58:48,61:48,63-64:48,95:48,126:48

Eso coloca a los caracteres 58 ( :) y 47 en la misma clase que las letras y los dígitos (48).

Lo que podría hacer es cambiar eso para dejarlo :en su propia clase a través de su propio archivo de recursos.

Por ejemplo, si agrega:

XTerm*charClass: 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

a su ~/".Xdefaults-$(uname -n)", luego al hacer doble clic en el nombre del archivo se detendrá en :.

Puedes experimentar con él con:

xterm -cc 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

También puede definir un método de selección diferente al hacer clic triple o cuádruple como expresión regular. Por ejemplo

XTerm*on3Clicks: regex [^:]+

Seleccionaría secuencias de caracteres sin dos puntos altriple clic.

Respuesta4

Esto es tremendamente ineficiente, ya que genera un nuevo grepproceso para cada archivo de entrada, pero:

Dada una lista de archivos (por ejemplo, *), haga

para f enlista_archivo
hacer
    grep --label="$f " --con-nombre de archivopatrón< "$f"
hecho

--label=stringdice, en efecto, "Al leer la entrada estándar, pretenda que el nombre del archivo de entrada es string".  --with-filename( -Hpara abreviar) dice: "Imprima el nombre del archivo para cada coincidencia". Este es el valor predeterminado cuando hay más de un archivo para buscar. IMNSHO, también debería estar activado de forma predeterminada cuando especificas --label, pero no parece funcionar de esa manera. Dado que mi código (arriba) agrega un espacio al nombre del archivo en el argumento to --label, obtienes un resultado similar a

Nombre del archivo:Patrón de coincidencia de líneas

Si sus nombres de archivos provienen de find, haga

encontrar(camino…) (expresión)-exec sh -c 'grep --label="$1 " -Hpatrón< "$1"' sh {} ";"

información relacionada