运行 fzf 预览中带有参数的 jq

Run jq in fzf preview with arguments

我有一些 json 数据,我想通过标准输入发送数据并在 fzf 查询框中输入 jq 查询,从而使用 fzf 和 jq 以交互方式查询它。

到目前为止,我的尝试是在框中显示一个结果,但编辑查询框的内容会将结果变为空白。

fzf-tmux --preview 'jq "$@"  <<< {}'    <<<'[{"x": 1}, {"y": 2}]' 

如果您希望 $@ 被 shell 扩展,那么简单的解决方法是修改引号:

fzf-tmux --preview 'jq '"$@"' <<< {}'

如果另一方面,您想要使用 fzf 的 {q} 功能(似乎是这种情况),那么您可能不走运,尽管这是否是因为 fzf 中的错误,或者 jq 和 fzf 之间的某些不兼容,我无法判断。

按路径导航

假设 $JSON 是一个包含单个 JSON 数组或对象的文件。然后当 运行 以下内容时,您将在 LHS 上看到路径,在 RHS 上看到所选路径处的值:

jq -rc paths "$JSON" |
  fzf-tmux --preview 'x={}; jq "getpath($x)" '"$JSON" 

最近 Hacker News post 关于使用 fzf 作为 REPL 让我认为 live-edit jq 过滤器也很棒。使用那篇文章中的基本实现,我最终得到:

echo '' | fzf --print-query --preview='jq {q} <(echo "[{"x": 1}, {"y": 2}]")'

您可以通过将其更改为:

(export json='[{"x": 1}, {"y": 2}]'; echo '' | fzf --print-query --preview='jq {q} <(echo $json)')

或(对于未验证的输入更安全):

(export json='[{"x": 1}, {"y": 2}]'; echo '' | fzf --print-query --preview='jq {q} <(printf "%s" "$json")')

最终示例,使用 StackExchange API 检索此 post:

(export json=$(curl -s --compressed -H "Accept-Encoding: GZIP" "https://api.stackexchange.com/2.2/posts/56744579?site=Whosebug&filter=withbody"); echo '' | fzf --print-query --preview-window=wrap --preview='filter={q}; jq -M -r "${filter}" <(printf "%s" "$json")')

又一个例子,大约 18 个月后添加的。这与前面的示例相同,但是对于鱼 shell。它还使用 httpie 来清理东西,因为 httpie 自动处理 encoding/compression 之类的东西。我也留下了这个的颜色输出:

begin
    set -lx jq_url 'https://api.stackexchange.com/2.2/posts/56744579?site=Whosebug&filter=withbody'
    echo '' | fzf --print-query --preview='set -x q {q}; jq -C {q} (http -b GET "$jq_url" | psub)'
end

注意:begin/end 块仅用于将变量保存在局部范围内。它们实际上并不是示例工作所必需的,只是为了避免污染命名空间。