这fzf 示例 wiki 页面描述如何使用 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 和我添加的目录只是因为我在自己的用例中执行了它,并且我不想修改命令以免它损坏 - 我对计算机不太擅长。
然后,它使用 sed 将所有分隔文件的空行替换为 NEWLINEHEREYO 标记。然后它使用 tr 截断所有换行符(这会破坏空行),给出单行输出,这就是您想要的。然后,它通过将 NEWLINEHEREYO 转换回换行符,使用另一个 sed 命令重新引入换行符,这样 fzf 就不会像字面意义上的单行一样搜索它。
这是非常低效的,但对于我的用例来说工作正常。我认为 sed、tr 和 sed 命令可能可以合并为一个,但我太笨了,无法做到这一点。