在 fzf 预览中使用参数运行 jq

问题描述 投票:0回答:2

我有一些 json 数据,我想用 fzf 和 jq 交互查询它,方法是通过 stdin 发送数据并在 fzf 查询框中输入 jq 查询。

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

fzf-tmux --preview 'jq "$@"  <<< {}'    <<<'[{"x": 1}, {"y": 2}]' 
jq fzf
2个回答
4
投票

最近一篇关于使用 fzf 作为 REPL 的

黑客新闻文章 
让我觉得实时编辑
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 检索此帖子:

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

又一个例子,大约 18 个月后添加。这与前面的示例相同,但适用于 Fish shell。它还使用

httpie
来清理事情,因为
httpie
自动处理编码/压缩等事情。我还在这个上留下了颜色输出:

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

注意:

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


2
投票

如果您期望

$@
被 shell 扩展,那么简单的修复方法就是修改引用:

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

另一方面,如果您想使用 fzf 的

{q}
功能(看起来确实如此),那么您可能会不走运,尽管这是因为 fzf 中的错误,还是 jq 和 jq 之间的某些不兼容fzf,我说不出来。

按路径导航

假设 $JSON 是一个包含单个 JSON 数组或对象的文件。然后,当运行以下命令时,您将在左侧看到路径,并在右侧看到所选路径的值:

jq -rc paths "$JSON" |
  fzf-tmux --preview 'x={}; jq "getpath($x)" '"$JSON" 
© www.soinside.com 2019 - 2024. All rights reserved.