Jak grepować bez wiodących białych znaków?

17

Przeglądam dużą bazę kodu, a wiodące białe znaki i tabulacja wydają się dość denerwujące. Czy jest jakiś sposób, aby się go pozbyć?

grep -R "something" ./

Np. Zamiast:

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

Chcę uzyskać coś takiego:

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

Albo lepiej:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd
Andrzej
źródło
Pozbyć się tego gdzie? W wyjściu? We wzorcu wyszukiwania?
Ignacio Vazquez-Abrams,
@Ignacio, w danych wyjściowych. Zaktualizowane pytanie
Andrew

Odpowiedzi:

4

Utwórz pliki testowe

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

produkować pełny wspaniały kolor :)

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

wyjście (uruchom go, aby uzyskać kolor).

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

Testowane w gnome-terminal , konsole, terminator,xterm

Peter.O
źródło
dobra robota! mały problem, ale zapominasz dopasować \tpostacie
Andrew
\t? ... Nie używa się go \tjako separatora, używa $ '\ x01' (hex 01) ... czy masz na myśli coś innego?
Peter.O
Mam na myśli, że mogą istnieć wiodące tabele, \ta także wiodące białe znaki\s
Andrew
... naprawiony. Zmieniono `` na [[:space:]]... Jeśli chcesz [ \t]
brać
6

Możesz je po prostu wyeliminować za pomocą sed

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

Spowoduje to usunięcie wiodących białych znaków z wyniku

Sudipta Chatterjee
źródło
1
Nie przyniesie to żadnego efektu, ponieważ na początku dowolnego wiersza na wyjściu nie ma spacji.
Abhishek A
6

Zakładając, że szukasz wzoru re (podstawowe wyrażenie regularne) w jednym pliku i chcesz usunąć wiodące białe znaki ze wszystkich pasujących wierszy:

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

(w rzeczywistości najpierw usuwa wszystkie wiodące białe znaki, a następnie szuka wzoru, ale wynik jest taki sam)

Aby grepzamiast tego przetworzyć dane wyjściowe (jak w edytowanym pytaniu):

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

Wzór [[:blank:]]*pasuje do zera lub więcej spacji lub tabulatorów.

Kusalananda
źródło
Dzięki, ostatni fragment działa dobrze. Czy jest jakiś sposób na zachowanie koloru wyjściowego?
Andrew
Kolor? Nazywaj mnie staroświeckim, ale mój terminal jest ściśle czarny i pomarańczowy ... (to „nie wiem”).
Kusalananda
3
Użyj --color = always (przy założeniu GNU grep) w wywołaniu grep. Wywołanie sed nie usuwa kolorów, sam grep nie używa koloru, gdy dane wyjściowe nie trafiają do terminala (z domyślną wartością --color = auto). „zawsze” zmusza go, no cóż, zawsze do używania koloru.
Jürgen A. Erhard
@Jurgen, dziękuję, ale z --color=alwaystym wyrażeniem regularnym nie działa: /
Andrew,
1
O rany, masz rację. Jest tak, ponieważ między okrężnicą a białymi odstępami znajdują się sekwencje kontrolne (dla koloru). Możesz umieścić sekwencje specjalne w wywołaniu sed (sekwencja dotyczy przynajmniej standardowej emulacji vt100 torfowiska (xterm, screen itp.)) „\ 033 [m \ 033 [K”. Myślę, że; D
Jürgen A , Erhard
-1

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

Praveen Kumar BS
źródło