Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json shell脚本分析问题:意外的无效字符(Windows cmd shell引用问题?)_Json_Bash_Shell_Parsing_Jq - Fatal编程技术网

Json shell脚本分析问题:意外的无效字符(Windows cmd shell引用问题?)

Json shell脚本分析问题:意外的无效字符(Windows cmd shell引用问题?),json,bash,shell,parsing,jq,Json,Bash,Shell,Parsing,Jq,我在做什么? 我有一个JSON文件sonar-report.JSON。我想在shell脚本中迭代sonar-report.json,以读取json的值。 为了解析JSON文件,我正在使用jq 所以下面的代码是我试图在shell脚本中执行的 alias jq=./jq-win64.exe for key in $(jq '.issues | keys | .[]' sonar-report.json); do echo "$key" line=$(jq -r ".issues[$k

我在做什么? 我有一个JSON文件sonar-report.JSON。我想在shell脚本中迭代sonar-report.json,以读取json的值。 为了解析JSON文件,我正在使用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
    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 bugs和中指出

这些bug报告中指出的任何解决方法都应该有效,但一旦修复程序进入发布二进制文件(大概是v1.7),最简单的解决方案就是使用新的
-b
命令行选项。(该选项在最近的jq预览版本中可用;请参阅上面列出的第二个bug报告):

在下一版本的
jq
可用之前,或者如果您出于某种原因不想升级,一个好的解决方法是通过管道将
jq
的输出通过
tr-d'\r'
移除CRs:

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
命令行选项或其他解决方法,具体取决于您打算对输出执行的操作。)

请将该示例输入的所需输出添加到您的问题中。在Linux下工作正常。输出为
15
Null
。你不想只使用
jq'.issues[].line'
?我使用的是windows机器,那么我应该怎么做来解决这个问题:(你使用的是哪个版本的jq?在什么环境下运行它?(Cygwin?Msys2?)好的,我对windows上的Git(或windows上的任何东西)不太了解我无法测试任何解决方案,但我怀疑您可以按照我的回答使用
-b
选项。谢谢,但它在windows git bash中不起作用:(WindowsGitBash给了我错误
未知选项-b
,我正在使用最新的JQ1.6version@DupinderSingh:好的,我想1870年bug报告中的修复程序还没有进入Windows二进制文件。因此,请使用
tr
解决方法:`for key in$(jq'。问题| keys |.[]'sonar-report.json | tr-d'\r');do
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
jq '.issues[].line' solar-response.json