Como faço para grep sem espaços em branco à esquerda?

17

Estou vasculhando uma grande base de código, e os principais espaços em branco e tabulação parecem bastante irritantes. Existe alguma maneira de se livrar disso?

grep -R "something" ./

Por exemplo, em vez de:

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

Eu quero algo como:

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

Ou melhor:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd
Andrew
fonte
Livrar-se disso onde? Na saída? No padrão de pesquisa?
Ignacio Vazquez-Abrams
@Ignacio, na saída. Pergunta atualizada
Andrew

Respostas:

4

Crie arquivos de teste

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

produzir cores gloriosas cheias :)

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

saída (execute para obter a cor).

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

Testado em gnome-terminal, konsole, terminator,xterm

Peter.O
fonte
bom trabalho! um pequeno problema, porém, você se esqueça de combinar \tcaracteres
Andrew
\t? ... Não está usando \tpara um separador, está usando $ '\ x01' (hex 01) ... ou você quer dizer outra coisa?
Peter.O
Quero dizer, pode haver principais tabulações \t, bem como os principais espaços em branco\s
Andrew
... fixo. Mudou `` para [[:space:]]... Se você quiser considerar apenas TAB e do espaço, e não todos os espaços em branco, use esta em vez disso:[ \t]
Peter.O
6

Você pode simplesmente eliminá-los usando sed

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

Isso removerá os principais espaços em branco da saída

Sudipta Chatterjee
fonte
11
Isso não terá nenhum efeito, pois não há espaços no início de nenhuma linha na saída.
Abhishek Um
6

Supondo que você esteja procurando um padrão re(uma expressão regular básica) em um arquivo e deseje remover o espaço em branco à esquerda de todas as linhas correspondentes:

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

(na verdade, isso remove primeiro todos os espaços em branco à esquerda e depois procura o padrão, mas o resultado é o mesmo)

Para pós-processar a grepsaída (como na sua pergunta editada):

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

O padrão [[:blank:]]*corresponde a zero ou mais espaços ou tabulações.

Kusalananda
fonte
Obrigado, o último trecho funciona bem. Existe alguma maneira de preservar a cor de saída?
Andrew
Cor? Me chame de antiquado, mas meu terminal é estritamente preto e laranja ... (isso é um "não sei").
Kusalananda
3
Use --color = always (assumindo GNU grep) na chamada grep. A chamada sed não remove as cores, é o próprio grep que não usa cores quando a saída não vai para um terminal (com o padrão --color = auto). "always" obriga a, bem, sempre use cores.
Jürgen A. Erhard
@Jurgen, obrigado, mas com --color=alwayseste regexp não funciona: /
Andrew
11
Oh merda, você está certo. Isso ocorre porque existem seqüências de controle (para a cor) entre os dois pontos e os espaços em branco. Você pode colocar as seqüências de escape na chamada sed (a sequência é, pelo menos para uma emulação padrão do pântano vt100 (xterm, tela etc.) "\ 033 [m \ 033 [K". Eu acho.; D
Jürgen A Erhard
-1

arquivo sed -n '/ pattern / p' | sed -r "s / \ s + // g"

Praveen Kumar BS
fonte