
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 -T
funcionará 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
,-n
y-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
grep
Hasta 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 grep
que 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 xterm
me 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 grep
proceso 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=string
dice, en efecto, "Al leer la entrada estándar, pretenda que el nombre del archivo de entrada es string
".
--with-filename
( -H
para 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 {} ";"