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.