Wie greife ich ohne führende Leerzeichen?


17

Ich greife durch eine große Codebasis und führende Leerzeichen und Tabellierungen scheinen ziemlich nervig zu sein. Gibt es eine Möglichkeit, es loszuwerden?

grep -R "something" ./

ZB anstelle von:

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

Ich möchte etwas bekommen wie:

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

Oder besser:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

Wo soll ich es loswerden? In der Ausgabe? Im Suchmuster?
Ignacio Vazquez-Abrams

@Ignacio, in der Ausgabe. Aktualisierte Frage
Andrew

Antworten:


4

Erstellen Sie Testdateien

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

produzieren volle herrliche Farbe :)

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

Ausgabe (führen Sie es aus, um die Farbe zu erhalten).

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

Geprüft gnome-terminal, konsole, terminator,xterm


gute Arbeit! Ein kleines Problem, aber Sie vergessen, \tZeichen zu vergleichen
Andrew

\t? ... es wird nicht \tfür einen Trenner verwendet, es wird $ '\ x01' (hex 01) verwendet ... oder meinst du etwas anderes?
Peter.O

Ich meine, es kann sowohl führende Tabellierungen \tals auch führende Leerzeichen geben\s
Andrew

... Fest. Geändert in [[:space:]]... Wenn Sie nur TAB und SPACE und nicht alle Leerzeichen berücksichtigen möchten , verwenden Sie stattdessen [ \t]
Folgendes

6

Sie können sie einfach mit beseitigen sed

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

Dadurch werden die führenden Leerzeichen aus der Ausgabe entfernt


1
Dies hat keine Auswirkungen, da am Anfang einer Zeile in der Ausgabe keine Leerzeichen stehen.
Abhishek A

6

Angenommen, Sie suchen nach einem Muster re(einem einfachen regulären Ausdruck) in einer Datei und möchten führende Leerzeichen aus allen übereinstimmenden Zeilen entfernen:

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

(Tatsächlich werden zuerst alle führenden Leerzeichen entfernt und dann das Muster gesucht, aber das Ergebnis ist dasselbe.)

So verarbeiten Sie die grepAusgabe stattdessen nach (wie in Ihrer bearbeiteten Frage):

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

Das Muster [[:blank:]]*entspricht keinem oder mehreren Leerzeichen oder Tabulatoren.


Danke, das letzte Snippet funktioniert einwandfrei. Gibt es eine Möglichkeit, die Ausgabefarbe beizubehalten?
Andrew

Farbe? Nennen Sie mich altmodisch, aber mein Terminal ist streng schwarz und orange ... (das ist ein "Ich weiß nicht").
Kusalananda

3
Verwenden Sie --color = always (unter der Annahme von GNU grep) für den grep-Aufruf. Der sed-Aufruf entfernt die Farben nicht, es ist grep selbst, das keine Farbe verwendet, wenn die Ausgabe nicht an ein Terminal geht (mit der Standardeinstellung --color = auto). "immer" zwingt es, immer Farbe zu verwenden.
Jürgen A. Erhard

@ Jürgen, danke, aber mit --color=alwaysdiesem Regexp funktioniert nicht: /
Andrew

1
Oh shucks, du hast recht. Das liegt daran, dass zwischen dem Doppelpunkt und dem Leerzeichen Kontrollsequenzen (für die Farbe) bestehen. Sie könnten die Escape-Sequenzen in den sed-Aufruf einfügen (die Sequenz ist, zumindest für eine vt100-Emulation nach Moorstandard (xterm, screen usw.) "\ 033 [m \ 033 [K". Ich denke.; D
Jürgen A Erhard

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.