在bash中嵌入jq-需要逃避什么?

在bash中嵌入jq-需要逃避什么?,bash,escaping,jq,quoting,Bash,Escaping,Jq,Quoting,我正在尝试内联一个本身需要管道的jq构造。我怀疑我遇到了问题,因为bash将它们视为bash级别的管道,而不是jq的一部分 在jqplay.org上测试,这个[1]|[timeEnded,.lifecycleState]|展平可以得到我需要的结果 尝试将其嵌入到bash中,我尝试执行以下操作: status=$(curl -X GET <URL> | jq -r -c '.[1] | [.timeEnded, .lifecycleState] | flatten' | awk -F,

我正在尝试内联一个本身需要管道的jq构造。我怀疑我遇到了问题,因为bash将它们视为bash级别的管道,而不是jq的一部分

在jqplay.org上测试,这个
[1]|[timeEnded,.lifecycleState]|展平
可以得到我需要的结果

尝试将其嵌入到bash中,我尝试执行以下操作:

status=$(curl -X GET <URL> | jq -r -c '.[1] | [.timeEnded, .lifecycleState] | flatten' | awk -F, '{print $2}' | sed 's/"//g')
我试图以
jq-r-c.[1]\\\\\\[.timeend.lifecycleState]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

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:error:syntax error,意外的无效字符,第1行应为$end(Unix shell引用问题?):
[1]\\\|[时间结束,.lifecycleState]\\\\|展平
jq:1编译错误
用双引号(以及转义字符)包装整个jq命令会给我同样的语法错误。我相信这里可能有一个简单的答案,但是jq对我来说是新的


任何帮助都将不胜感激。

我显然怀疑您在这一部分有一个牢不可破的空间:

jq -r -c '.[1] | [...
因此,手动编辑该行,并将所有空格替换为实空格(注意不要再次使用AltGr+空格键入不可破空格)

在bash中嵌入jq-需要逃避什么

使用bash和类似bash的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代码中使用单引号和反斜杠对我很有效。URL是否包含一些可疑字符?当您在努力引用时,该URL有助于参考;它会告诉你,在单引号中,这可能会帮助你看到,在这种情况下,逃跑不是问题所在。不用说,不寻常的空白字符总是让人难以辨认:)该死,看起来这就是问题所在。我从jqplay.org复制并粘贴了一些东西,我猜它插入了一些古怪的东西。花时间试图找出与转义字符完全无关的转义字符肯定会让人恼火。谢谢
sed -e $'s/\'/\\\'/g' -e $'s/\\\\/\\\\\\\\/g'