¿Cómo hago grep sin espacios en blanco?


17

Estoy buscando a través de una gran base de código, y los espacios en blanco y la tabulación parecen ser bastante molestos. ¿Hay alguna forma de deshacerse de él?

grep -R "something" ./

Por ejemplo, en lugar de:

foo/bar.cpp:                       qwertyuiosomethingoi
foo/bar/baz.h:                          43rfsgsomethingdrfg
bar/bar.cpp:            1234edwssomethingczd

Quiero obtener algo como:

foo/bar.cpp: qwertyuiosomethingoi
foo/bar/baz.h: 43rfsgdsomethingrfg
bar/bar.cpp: 1234edwssomethingczd

O mejor:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

Deshazte de donde? En la salida? En el patrón de búsqueda?
Ignacio Vazquez-Abrams

@Ignacio, en salida. Pregunta actualizada
Andrew

Respuestas:


4

Crear archivos de prueba

echo -e "\t   foo-somethingfoo" >something.foo
echo "    bar-bar-somethingbar" >something.bar_bar
echo "baz-baz-baz-somethingbaz" >something.baz_baz_baz
echo "  spaces    something  s" >something.spaces

producir color glorioso completo :)

grep --colour=always "something" something.* | 
 sed -re  's/^([^:]+):(\x1b\[m\x1b\[K)[[:space:]]*(.*)/\1\x01\2\3/' |
   column -s $'\x01' -t

salida (ejecútelo para obtener el color).

something.bar_bar      bar-bar-somethingbar
something.baz_baz_baz  baz-baz-baz-somethingbaz
something.foo          foo-somethingfoo
something.spaces       spaces    something  s

Probado en gnome-terminal, konsole, terminator,xterm


¡buen trabajo! un pequeño problema, sin embargo, te olvidas de emparejar \tpersonajes
Andrew

\t? ... No está usando \tpara un separador, está usando $ '\ x01' (hex 01) ... ¿o quieres decir algo más?
Peter.O

Quiero decir que puede haber tabulaciones principales \t, así como espacios en blanco principales\s
Andrew

... arreglado. Se cambió `` a [[:space:]]... Si solo desea considerar TAB y SPACE, y no todos los espacios en blanco, use esto en su lugar:[ \t]
Peter.O

6

Puedes eliminarlos usando sed

grep blah filename.foo | sed -e 's/^[ \t]*//'

Eso eliminará los espacios en blanco iniciales de la salida


1
Esto no tendrá ningún efecto, ya que no hay espacios al comienzo de ninguna línea en la salida.
Abhishek A

6

Suponiendo que está buscando un patrón re(una expresión regular básica) en un archivo, y desea eliminar los espacios en blanco iniciales de todas las líneas coincidentes:

sed -n -e 's/^[[:blank:]]*//' -e '/re/p' thefile.c

(en realidad, esto elimina primero todos los espacios en blanco iniciales y luego busca el patrón, pero el resultado es el mismo)

Para procesar posteriormente el grepresultado (como en su pregunta editada):

grep re * | sed 's/:[[:blank:]]*/: /'

El patrón [[:blank:]]*coincide con cero o más espacios o pestañas.


Gracias, el último fragmento funciona bien. ¿Hay alguna forma de preservar el color de salida?
Andrew

¿Color? Llámame anticuado, pero mi terminal es estrictamente negro y naranja ... (eso es un "No sé").
Kusalananda

3
Use --color = always (suponiendo GNU grep) en la llamada grep. La llamada sed no elimina los colores, es grep en sí mismo que no usa color cuando la salida no va a una terminal (con el valor predeterminado de --color = auto). "siempre" lo obliga, bueno, a usar siempre el color.
Jürgen A. Erhard

@Jurgen, gracias, pero con --color=alwaysesta expresión regular no funciona: /
Andrew

1
Oh diablos, tienes razón. Eso es porque hay secuencias de control (para el color) entre el colon y el espacio en blanco. Podría poner las secuencias de escape en la llamada sed (la secuencia es, al menos para una emulación vt100 estándar de pantano (xterm, pantalla, etc.) "\ 033 [m \ 033 [K". Creo.; D
Jürgen A Erhard

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.