Wie verwende ich fzf, um in allen Zeilen von Dateien zu suchen (Zeilenumbrüche ignorieren)?

Wie verwende ich fzf, um in allen Zeilen von Dateien zu suchen (Zeilenumbrüche ignorieren)?

DerFZF-Beispiele Wiki-Seitebeschreibt, wie man mit fzf eine Fuzzy-Suche innerhalb des Inhalts aller Dateien eines Verzeichnisses durchführen kann. Aber in den Beispielen von der Wiki-Seite, z. B. mit

ag --nobreak --nonumbers --noheading . | fzf

Die Dateien werden nach Zeilen aufgeteilt und jede Zeile wird separat behandelt.

Zum Beispiel eine Datei:

hello
world

würde nicht mit dem Suchbegriff "Hallo Welt" übereinstimmen, da die Suchbegriffe in unterschiedlichen Zeilen stehen.

Wie kann ich fzf so verwenden, dass es innerhalb der gesamten Datei und nicht nur zeilenweise sucht?

Antwort1

Ich habe eine etwas schmutzige Lösung.

rg --heading --glob "*.txt" . some_directory_path | sed 's/^$/NEWLINEHEREYO/g' | tr '\n' ' ' | sed 's/NEWLINEHEREYO/\n/g' | fzf

Erläuterung:

wenn Sie das tun

rg . 

irgendwo druckt es die Ausgabe in einem bestimmten Format auf das Terminal, das verloren geht, wenn Sie versuchen, es irgendwohin weiterzuleiten. Ich finde, das Format ist notwendig, um dies effizient tun zu können. Daher das Flag --heading, das das Format beibehält. --glob und das Verzeichnis habe ich nur hinzugefügt, weil ich es in meinem eigenen Anwendungsfall getan habe und den Befehl nicht ändern wollte, damit er nicht abbricht – ich kenne mich mit Computern nicht so gut aus.

Anschließend werden alle leeren Zeilen, die Dateien trennen, mithilfe von sed durch das NEWLINEHEREYO-Tag ersetzt. Anschließend werden alle Zeilenumbruchzeichen (die die leeren Zeilen zerstören würden) mithilfe von tr abgeschnitten, sodass eine einzeilige Ausgabe ausgegeben wird, was Sie wollten. Anschließend werden die Umbrüche mit einem weiteren sed-Befehl wieder eingeführt, indem die NEWLINEHEREYOs wieder in Zeilenumbrüche umgewandelt werden, sodass fzf nicht danach sucht, als wäre es buchstäblich eine einzelne Zeile.

Es ist sehr ineffizient, funktioniert aber für meinen Anwendungsfall einwandfrei. Ich denke, die Befehle sed, tr und sed können wahrscheinlich zu einem zusammengeführt werden, aber ich bin zu dumm dazu.

verwandte Informationen