json - shell 脚本解析问题 : unexpected INVALID_CHARACTER (Windows cmd shell quoting issues? )

标签 json bash shell parsing jq

我在做什么?
我有一个 JSON 文件作为 sonar-report.json。我想在 shell 脚本中迭代 sonar-report.json,以读取 json 的值。
要解析 JSON 文件,我使用 jq https://stedolan.github.io/jq/

所以下面的代码我试图在shell脚本中执行

alias jq=./jq-win64.exe
for key in $(jq '.issues | keys | .[]' sonar-report.json); do
    echo "$key"
    line=$(jq -r ".issues[$key].line" sonar-report.json)
done

问题
当我执行这个时,控制台给我错误:
jq: error: syntax error, unexpected INVALID_CHARACTER (Windows cmd shell quoting issues?) at <top-level>, line 1:

如果我更新我上面的脚本,并添加数组的静态索引,那么脚本工作正常
alias jq=./jq-win64.exe

for key in $(jq '.issues | keys | .[]' sonar-report.json); do
    echo "$key"
    line0=$(jq -r ".issues[0].line" sonar-report.json)
    line1=$(jq -r ".issues[1].line" sonar-report.json)
done

所以最后我想要的是:
我想迭代值并在控制台中打印
alias jq=./jq-win64.exe
for key in $(jq '.issues | keys | .[]' sonar-report.json); do
    line=$(jq -r ".issues[$key].line" sonar-report.json)
    echo $line
done

所以输出应该是
15

这是我的 JSON 文件 sonar-report.json
{
"issues": [
        {
            "key": "016B7970D27939AEBD",
            "component": "bits-and-bytes:src/main/java/com/catalystone/statusreview/handler/StatusReviewDecisionLedHandler.java",
            "line": 15,
            "startLine": 15,
            "startOffset": 12,
            "endLine": 15,
            "endOffset": 14,
            "message": "Use the \"equals\" method if value comparison was intended.",
            "severity": "MAJOR",
            "rule": "squid:S4973",
            "status": "OPEN",
            "isNew": true,
            "creationDate": "2019-06-21T15:19:18+0530"
        },
        {
            "key": "AWtqCc-jtovxS8PJjBiP",
            "component": "bits-and-bytes:src/test/java/com/catalystone/statusreview/service/StatusReviewInitiationSerivceTest.java",
            "message": "Fix failing unit tests on file \"src/test/java/com/catalystone/statusreview/service/StatusReviewInitiationSerivceTest.java\".",
            "severity": "MAJOR",
            "rule": "common-java:FailedUnitTests",
            "status": "OPEN",
            "isNew": false,
            "creationDate": "2019-06-18T15:32:08+0530"
        }
    ]
}

请帮助我,提前致谢

最佳答案

在我看来,这就像一个 Windows/Unix 行尾不兼容的实例,在 jq 错误中指出 92 (for Cygwin)1870 (for MSYS2) .
这些错误报告中指出的任何解决方法都应该有效,但是一旦修复进入发布二进制文件(大概是 v1.7),最简单的解决方案是使用新的 -b。命令行选项。 (该选项在最近的 jq 预览版本中可用;请参阅上面列出的第二个错误报告):

for key in $(jq -b '.issues | keys | .[]' sonar-report.json); do
    line=$(jq -rb ".issues[$key].line" sonar-report.json)
    # I added quotes in the next line, because it's better style.
    echo "$line"
done
直到下一个版本jq可用,或者如果您出于某种原因不想升级,一个好的解决方法是通过管道输出 jq 来删除 CR。通过 tr -d '\r' :
for key in $(jq -'.issues | keys | .[]' sonar-report.json | tr -d '\r'); do
    line=$(jq -r ".issues[$key].line" sonar-report.json | tr -d '\r')
    echo "$line"
done
但是,正如 Cyrus 在评论中指出的那样,您可能不需要在 shell 循环中逐行迭代,这是非常低效的,因为它会导致多次重新解析整个 JSON 输入。您可以使用 jq 本身进行迭代,方法要简单得多:
jq '.issues[].line' solar-response.json
它将只解析一次 JSON 文件,然后生成每个 .line文件中的值。 (您可能仍想使用 -b 命令行选项或其他解决方法,具体取决于您打算对输出做什么。)

关于json - shell 脚本解析问题 : unexpected INVALID_CHARACTER (Windows cmd shell quoting issues? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716155/

相关文章:

json - Pandas 将字符串类型的 JSON 值转换为 INT

javascript - Json字符串解析问题

linux - 仅在非交互式运行 bash 脚本时出现错误 "cat: write error: Broken pipe"

python - 如何在 Mac 上的 python 脚本中删除 bash 历史记录?

linux 以毫秒为单位使用超时终止进程

json - 如何从外部查看器调试器可视化工具获取对象或其数据的引用?

sql - 如何读取 JSON 键值作为 Snowflake 中的数据列?

linux - 如何将一个查询的结果连接到另一个查询

linux - : ". [script]" or "source [script]", "bash [script] or $SHELL [script]"和 "./[script]"或 "[script]"有什么区别?

linux - 在与 nohup 兼容的 shell 脚本中替代 ls