0

我有一些 json 数据,我想用 fzf 和 jq 交互地查询它,通过标准输入发送数据并将 jq 查询输入到 fzf 查询框中。

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

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

2 回答 2

3

最近一篇关于将 fzf 用作 REPL 的Hacker News 帖子让我认为实时编辑 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")')

又一个例子,大约在 18 个月后添加。这与前面的示例相同,但针对的是鱼壳。它也可以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块仅用于将变量保留在本地范围内。示例工作实际上不需要它们,只是为了避免污染命名空间。

于 2019-07-20T05:25:25.853 回答
2

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

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

另一方面,如果您想使用{q}fzf 的功能,似乎是这种情况,那么您可能会不走运,尽管那是因为 fzf 中的错误,还是因为 jq 和 fzf 之间的某些不兼容,我不能告诉。

按路径导航

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

jq -rc paths "$JSON" |
  fzf-tmux --preview 'x={}; jq "getpath($x)" '"$JSON" 
于 2019-06-25T04:53:49.730 回答