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

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


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.