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.