Come posso grep senza condurre spazi bianchi?


17

Sto frugando in una grande base di codice e i principali spazi bianchi e tabulazioni sembrano essere abbastanza fastidiosi. C'è un modo per sbarazzarsene?

grep -R "something" ./

Ad esempio, invece di:

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

Voglio ottenere qualcosa del tipo:

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

O meglio:

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

Liberarsene dove? Nell'output? Nel modello di ricerca?
Ignacio Vazquez-Abrams,

@Ignacio, in uscita. Domanda aggiornata
Andrew,

Risposte:


4

Crea file di test

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

produce un colore pieno e glorioso :)

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

output (eseguilo per ottenere il colore).

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

Testato in gnome-terminal, konsole, terminator,xterm


buon lavoro! un piccolo problema, però, ti dimentichi di abbinare i \tpersonaggi
Andrew,

\t? ... Non sta usando \tun separatore, sta usando $ '\ x01' (hex 01) ... o vuoi dire qualcos'altro?
Peter

Voglio dire, ci possono essere tabulazioni \tprincipali e spazi bianchi principali\s
Andrew

... risolto. Modificato `` in [[:space:]]... Se vuoi considerare solo TAB e SPACE, e non tutti gli spazi bianchi, usa questo invece:[ \t]
Peter.O

6

Puoi semplicemente eliminarli usando sed

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

Ciò rimuoverà gli spazi bianchi principali dall'output


1
Questo non avrà alcun effetto, poiché non ci sono spazi all'inizio di nessuna riga nell'output.
Abhishek,

6

Supponendo che tu stia cercando un modello re(un'espressione regolare di base) in un file e desideri rimuovere lo spazio bianco iniziale da tutte le linee corrispondenti:

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

(in realtà, questo rimuove prima tutti gli spazi bianchi principali, quindi cerca il motivo, ma il risultato è lo stesso)

Per greppostelaborare invece l' output (come nella domanda modificata):

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

Il modello [[:blank:]]*corrisponde a zero o più spazi o schede.


Grazie, l'ultimo frammento funziona bene. Esiste un modo per preservare il colore di output?
Andrew,

Colore? Chiamami vecchio stile, ma il mio terminale è rigorosamente nero e arancione ... (è un "Non lo so").
Kusalananda

3
Usa --color = always (assumendo GNU grep) nella chiamata grep. La chiamata sed non rimuove i colori, è grep stesso che non usa il colore quando l'output non va su un terminale (con il default di --color = auto). "sempre" lo costringe a usare sempre il colore.
Jürgen A. Erhard,

@Jurgen, grazie, ma con --color=alwaysquesta regexp non funziona: /
Andrew

1
Oh cazzate, hai ragione. Questo perché ci sono sequenze di controllo (per il colore) tra i due punti e lo spazio bianco. È possibile inserire le sequenze di escape nella chiamata sed (la sequenza è, almeno per un'emulazione vt100 standard di bog (xterm, screen, ecc.) "\ 033 [m \ 033 [K". Penso.; D
Jürgen A Erhard,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.