Formatieren der Ausgabe von grep beim Abgleichen mehrerer Dateien

Formatieren der Ausgabe von grep beim Abgleichen mehrerer Dateien

Bei der Suche in mehreren Dateien sieht die Ausgabe von grep ungefähr so ​​aus:

{FILE}:{MATCH}

Das ist ein Problem, denn wenn ich auf den Teil doppelklicke {FILE}, wähle ich zumindest auch den :und möglicherweise einen Teil der Übereinstimmung aus (und kopiere ihn). Wie kann ich grep dazu bringen, seine Ausgabe stattdessen etwa so zu formatieren:

{FILE} : {MATCH}

Grundsätzlich möchte ich vor der Spalte ein Leerzeichen einfügen. (und optional eines danach)

Antwort1

grep -Twird 7/8 der Zeit funktionieren.

% for f in a ab abc abcd abcde abcdef abcdefg abcdefgh; do echo pattern > $f; done
% grep -T pattern *
a      :pattern
ab     :pattern
abc    :pattern
abcd   :pattern
abcde  :pattern
abcdef :pattern
abcdefg:pattern
abcdefgh       :pattern

Von demGNU Grep-Handbuch:

-T --initial-tab

Stellen Sie sicher, dass das erste Zeichen des tatsächlichen Zeileninhalts auf einem Tabulatorstopp liegt, damit die Ausrichtung der Tabulatoren normal aussieht. Dies ist bei Optionen nützlich, die ihrer Ausgabe den tatsächlichen Inhalt voranstellen: -H, -n, und -b. Um die Wahrscheinlichkeit zu erhöhen, dass Zeilen aus einer einzelnen Datei alle in derselben Spalte beginnen, bewirkt dies auch, dass die Zeilennummer und der Byte-Offset (falls vorhanden) in einer Feldbreite mit minimaler Größe gedruckt werden.

Antwort2

grepDies kann meines Wissens nicht allein durchgeführt werden . Vorausgesetzt, Ihre Dateinamen enthalten kein ::

grep ... | sed 's/:/ : /'

Nur der erste :wird aufgefüllt.

Natürlich können Sie angeben, grepdass nur Dateinamen gedruckt werden sollen:

grep -l ...

Antwort3

Was ist einWortWas die Auswahl durch Doppelklicken betrifft, ist sie vom Terminal (und/oder X-Toolkit) abhängig und bei manchen Terminals anpassbar.

Für xterm,Die Charaktere sind organisiert inKlassen(Buchstaben, Leerzeichen usw.) und durch Doppelklicken werden benachbarte Zeichen derselben Klasse ausgewählt.

Der Standardwert ist beschriebenDortIn diesem Standard :istnichtin derselben Klasse wie /es selbst, nicht in derselben Klasse wie Buchstaben oder Ziffern.

Einige Systeme ändern diese Vorgabe, indem sie eineRessourcendateifür xtermzum Beispiel /etc/X11/app-defaults/XTerm.

Auf einem Linux Mint-System finde ich dort:

! Here is a pattern that is useful for double-clicking on a URL:
*charClass: 33:48,35:48,37-38:48,43-47:48,58:48,61:48,63-64:48,95:48,126:48

Damit werden die Zeichen 58 ( :) und 47 in dieselbe Klasse wie Buchstaben und Ziffern (48) eingeordnet.

Sie können dies so ändern, dass es :über Ihre eigene Ressourcendatei in einer eigenen Klasse belassen wird.

Wenn Sie beispielsweise hinzufügen:

XTerm*charClass: 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

zu Ihrem ~/".Xdefaults-$(uname -n)", dann wird durch Doppelklicken auf den Dateinamen bei angehalten :.

Sie können damit experimentieren mit:

xterm -cc 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

Sie können auch eine andere Auswahlmethode für Dreifach- oder Vierfachklicks als regulären Ausdruck definieren. Zum Beispiel

XTerm*on3Clicks: regex [^:]+

Wählt Sequenzen von Zeichen außer Doppelpunkten aus, wennDreifachklick.

Antwort4

Dies ist äußerst ineffizient, da dadurch grepfür jede Eingabedatei ein neuer Prozess gestartet wird, aber:

Gegeben sei eine Liste von Dateien (z. B. *),

für f inDateiliste
Tun
    grep --label="$f " --mit-DateinameMuster< "$f"
Erledigt

--label=stringsagt im Grunde: „Wenn Sie die Standardeingabe lesen, tun Sie so, als wäre der Eingabedateiname string.“  --with-filename( -Hkurz) sagt: „Drucken Sie den Dateinamen für jede Übereinstimmung.“ Dies ist die Standardeinstellung, wenn mehr als eine Datei durchsucht werden muss. Meiner bescheidenen Meinung nach sollte es auch standardmäßig aktiviert sein, wenn Sie angeben --label, aber so scheint es nicht zu funktionieren. Da mein Code (oben) dem Dateinamen im Argument ein Leerzeichen hinzufügt --label, erhalten Sie eine Ausgabe, die wie folgt aussieht:

Dateiname:Linienanpassungsmuster

Wenn Ihre Dateinamen von stammen find,

finden(Pfad…) (Ausdruck)-exec sh -c 'grep --label="$1 " -HMuster< "$1"' sh {} ";"

verwandte Informationen