Как использовать fzf для поиска по всем строкам файлов (игнорируя переводы строк)?

Как использовать fzf для поиска по всем строкам файлов (игнорируя переводы строк)?

Thefzf примеры вики-страницаописывает, как fzf может быть использован для нечеткого поиска в содержимом всех файлов каталога. Но в примерах со страницы вики, например, с

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

файлы разделяются по строкам, и каждая строка обрабатывается отдельно.

Например, файл:

hello
world

не будет соответствовать поисковому запросу «hello world», поскольку поисковые запросы находятся в разных строках.

Как использовать fzf, чтобы поиск производился по всему файлу, а не только по строкам?

решение1

У меня есть несколько грязное решение.

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

объяснение:

когда ты это делаешь

rg . 

где-то он выводит вывод на терминал в определенном формате, который теряется, если вы пытаетесь куда-то его передать. Я считаю, что формат необходим для того, чтобы это можно было делать эффективно. Отсюда флаг --heading, который поддерживает формат. --glob и каталог я добавил только потому, что я сделал это в своем собственном сценарии использования, и я не хотел изменять команду, чтобы она не сломалась — я не так хорош в компьютерах.

Затем он заменяет все пустые строки, которые разделяют файлы, тегом NEWLINEHEREYO с помощью sed. Затем он обрезает все символы новой строки (которые уничтожат пустые строки) с помощью tr, давая однострочный вывод, что и было нужно. Затем он снова вводит разрывы с помощью другой команды sed, преобразуя NEWLINEHEREYO обратно в разрывы строк, чтобы fzf не искал его так, как будто это буквально одна строка.

Это очень неэффективно, но работает нормально для моего варианта использования. Я думаю, что команды sed, tr и sed, вероятно, можно объединить в одну, но я слишком глуп, чтобы сделать это.

Связанный контент