【问题标题】:Interpolating Strings Using jq使用 jq 插值字符串
【发布时间】:2014-10-29 23:08:59
【问题描述】:

我正在使用 jq 解析 JSON 数据并根据作为命令行参数给出的动态键值提取一个值。我注意到这是可行的,但我对它如何在单引号内插入 $v 持怀疑态度。是否可以在双引号内重写表达式'.["\($v)"]'?我做错了什么?

无论出于何种原因,尝试以下方法均无效:

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" ".[\"\\($v)\"]")

但是,这样做:

recipe_key='Wilted Greens' # example key to interpolate

recipe_url=$(cat ./*.json | jq -r --arg v "$recipe_key" '.["\($v)"]') # works!

【问题讨论】:

  • 你们俩都是对的,我能够从问题中得到两个观点。主要要关注的是为什么我错误地继续使用双引号并从中得出答案。这就是 Stackoverflow 的伟大之处。更重要的是要找到答案,而不是得到一个确定的答案。
  • 我没有说“好”和“坏”。我表示不理解为什么当单引号避免任何和所有插值时,OP 要使用双引号,而这正是他试图避免的那种插值,以及他发布的 exact 问题是哪种插值关于。
  • @EtanReisner 我的观点是,为什么他想以“坏”的方式来做这件事并不重要。像我一样向他展示“坏”的方式,如果你愿意,还可以告诉他“更好”的方式,然后让他决定。
  • 你一直在说“不好”。我没这么说。我是直接回应帖子中隐含的推理。他说他想避免插值,同时询问如何在刚刚启用插值而不是使用他开始使用的不插值的单引号时让他的代码工作。

标签: linux bash jq


【解决方案1】:

你还没有逃脱$v,所以 Bash 认为它是一个 Bash 变量,可能是一个空变量。 试试这个

".[\"\\(\$v)\"]"
#       ^
#       |
#       --- notice

在我看来,在这种情况下最好使用带单引号的 --arg--arg 的实现与 awk -v 类似,以准确解决这种引用问题的情况。

【讨论】:

  • 一个……我花了好几个小时试图把它弄好。你怎么知道它是把它当作一个 bash 变量?另外,你觉得这样做比使用单引号更有意义吗?
  • +1 再次感谢史蒂文。我真的需要对此提出第二意见,而你所说的更有意义。
【解决方案2】:

我注意到这是可行的,但我对它如何在单引号内插入 $v 持怀疑态度。

单引号不要插入变量或评估其他任何内容。

没有什么在单引号中是神奇的。你甚至不能在单引号内转义单引号。

您遇到的引用/转义问题只是因为您在这里尝试使用双引号而不是单引号。

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多