如何用rga、fzf搜索PDF并通过sioyek打开对应页码
解决方案
要实现用rga+fzf搜索PDF内容并调用sioyek定位到匹配页码,核心是正确提取rga输出里的PDF路径和页码,以下是直接可用的脚本和分步说明:
直接可用的脚本
#!/bin/bash # 传入搜索关键词,比如:./rga-sioyek.sh "你的搜索词" QUERY="$1" rga --pretty -i "$QUERY" | fzf | sed -E 's/(.*):Page ([0-9]+):.*/\1 \2/' | while read -r PDF PAGE; do sioyek "$PDF" --page "$PAGE" done
分步解释
rga搜索:
rga --pretty -i "$QUERY"--pretty强制rga输出标准化格式:PDF文件路径:Page N:匹配内容,这是提取参数的基础-i忽略大小写,适配不同的搜索需求
fzf选择:
fzf- 把rga的搜索结果传入fzf,可视化选择你要打开的匹配项
提取参数:
sed -E 's/(.*):Page ([0-9]+):.*/\1 \2/'- 用正则匹配rga的输出行,捕获PDF路径(第一组)和页码数字(第二组),直接输出
路径 页码的格式 - 比awk更简洁,无需额外处理字符串
- 用正则匹配rga的输出行,捕获PDF路径(第一组)和页码数字(第二组),直接输出
调用sioyek:
while read -r PDF PAGE; do sioyek "$PDF" --page "$PAGE"; done- 读取提取出的路径和页码,调用sioyek的
--page参数直接定位到目标页 - 引号包裹变量,兼容带空格的PDF路径
- 读取提取出的路径和页码,调用sioyek的
适配官方rga-fzf脚本的修改
如果你用的是官方rga-fzf脚本,只需要替换其中打开编辑器的部分:
找到类似nvim "$file"的行,替换成上述的参数提取+sioyek调用逻辑即可,比如:
# 替换原脚本里的打开逻辑 selected=$(fzf ...) # 原fzf选择部分 echo "$selected" | sed -E 's/(.*):Page ([0-9]+):.*/\1 \2/' | while read -r PDF PAGE; do sioyek "$PDF" --page "$PAGE" done
注意事项
- 确保sioyek已加入系统PATH,能直接在终端调用
- 如果rga输出的页码格式有变体(比如
Page 003),正则依然能正确提取数字 - 若需要搜索特定目录,在rga后加上目录路径即可:
rga --pretty -i "$QUERY" ./docs/
内容的提问来源于stack exchange,提问作者jumper
相关产品推荐
相关产品推荐

