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

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


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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.