在 bash 中嵌入 jq - 需要转义什么?
Embedding jq in bash - what needs to be escaped?
我正在尝试内联一个本身需要管道的 jq 结构。我怀疑我 运行 遇到了问题,因为 bash 将它们视为 bash 级别的管道,而不是 jq 的一部分。
在 jqplay.org 进行测试,.[1] | [.timeEnded, .lifecycleState] | flatten
得到了我需要的结果。
试图将其嵌入 bash,我正在尝试做类似的事情:
status=$(curl -X GET <URL> | jq -r -c '.[1] | [.timeEnded, .lifecycleState] | flatten' | awk -F, '{print }' | sed 's/"//g')
在 jq 中没有转义管道,我得到
[.timeEnded,: command not found
我试图将这些管道转义为 jq -r -c '.[1] \| [.timeEnded, .lifecycleState] \| flatten'
,但这让我遇到了 jq 语法错误:
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.[1] \| [.timeEnded, .lifecycleState] \| flatten
jq: 1 compile error
用双引号(以及转义字符)将整个 jq 命令引起来同样的语法错误。我确定这里可能有一个简单的答案,但 jq 对我来说是新的。
如有任何帮助,我们将不胜感激。
我明显怀疑你这部分牢不可破space:
jq -r -c '.[1] | [...
因此,手动编辑该行,并将所有 space 替换为真实的 space(注意不要键入 unbreakable spaces 再次使用 AltGr+space)
Embedding jq in bash - what needs to be escaped?
使用 bash 和 bash-like shell,通常可以使用单引号字符串在命令行上非常简单地指定 jq 程序,例如
$ jq -n '"abc"'
"abc"
但是,使用这种技术,单引号很头疼,因为bash
不允许在普通单引号字符串中使用单引号。解决方法非常糟糕:
$ jq -n '"a'"'"'b"'
"a'b"
所以如果jq程序确实嵌入了单引号,那么
可能是时候使用 -f 选项了,但如果不是
一个选项,然后应考虑使用 $'STRING'
形式。
虽然在这种情况下,jq 程序中可以出现两个字符,
这需要注意:单引号和反斜杠
例如:
$ jq -n $'"a\tb" | "\'\(.)\'"'
"'a\tb'"
如果我没记错的话,所需的转义可以使用:
sed -e $'s/\'/\\'/g' -e $'s/\\/\\\\/g'
我正在尝试内联一个本身需要管道的 jq 结构。我怀疑我 运行 遇到了问题,因为 bash 将它们视为 bash 级别的管道,而不是 jq 的一部分。
在 jqplay.org 进行测试,.[1] | [.timeEnded, .lifecycleState] | flatten
得到了我需要的结果。
试图将其嵌入 bash,我正在尝试做类似的事情:
status=$(curl -X GET <URL> | jq -r -c '.[1] | [.timeEnded, .lifecycleState] | flatten' | awk -F, '{print }' | sed 's/"//g')
在 jq 中没有转义管道,我得到
[.timeEnded,: command not found
我试图将这些管道转义为 jq -r -c '.[1] \| [.timeEnded, .lifecycleState] \| flatten'
,但这让我遇到了 jq 语法错误:
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.[1] \| [.timeEnded, .lifecycleState] \| flatten
jq: 1 compile error
用双引号(以及转义字符)将整个 jq 命令引起来同样的语法错误。我确定这里可能有一个简单的答案,但 jq 对我来说是新的。
如有任何帮助,我们将不胜感激。
我明显怀疑你这部分牢不可破space:
jq -r -c '.[1] | [...
因此,手动编辑该行,并将所有 space 替换为真实的 space(注意不要键入 unbreakable spaces 再次使用 AltGr+space)
Embedding jq in bash - what needs to be escaped?
使用 bash 和 bash-like shell,通常可以使用单引号字符串在命令行上非常简单地指定 jq 程序,例如
$ jq -n '"abc"'
"abc"
但是,使用这种技术,单引号很头疼,因为bash 不允许在普通单引号字符串中使用单引号。解决方法非常糟糕:
$ jq -n '"a'"'"'b"'
"a'b"
所以如果jq程序确实嵌入了单引号,那么
可能是时候使用 -f 选项了,但如果不是
一个选项,然后应考虑使用 $'STRING'
形式。
虽然在这种情况下,jq 程序中可以出现两个字符, 这需要注意:单引号和反斜杠
例如:
$ jq -n $'"a\tb" | "\'\(.)\'"'
"'a\tb'"
如果我没记错的话,所需的转义可以使用:
sed -e $'s/\'/\\'/g' -e $'s/\\/\\\\/g'