如何使用 fzf 在文件的所有行中搜索(忽略换行符)?

如何使用 fzf 在文件的所有行中搜索(忽略换行符)?

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 命令可能可以合并为一个,但我太笨了,无法做到这一点。

相关内容