Dup*_*ngh 4 bash shell parsing json 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
Run Code Online (Sandbox Code Playgroud)
问题 当我执行此操作时,控制台给出错误:
jq: error: syntax error, unexpected INVALID_CHARACTER (Windows cmd shell quoting issues?) at <top-level>, line 1:
Run Code Online (Sandbox Code Playgroud)
如果我更新上面的脚本,并添加数组的静态索引,那么脚本可以正常工作
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
Run Code Online (Sandbox Code Playgroud)
所以最后我想要的是: 我想迭代值并在控制台中打印
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
Run Code Online (Sandbox Code Playgroud)
所以输出应该是
15
Run Code Online (Sandbox Code Playgroud)
这是我的 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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
请帮助我,提前致谢
在我看来,这就像 Windows/Unix 行结束不兼容的一个实例,在 jq bug 92(对于 Cygwin)和1870(对于 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
Run Code Online (Sandbox Code Playgroud)
在下一个版本jq
可用之前,或者如果您出于某种原因不想升级,一个好的解决方法是通过管道传输 through 的输出来删除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
Run Code Online (Sandbox Code Playgroud)
然而,正如 Cyrus 在评论中指出的那样,您可能不需要在 shell 循环中逐行迭代,这是非常低效的,因为它会导致多次重新解析整个 JSON 输入。您可以使用 jq 本身进行迭代,更简单:
jq '.issues[].line' solar-response.json
Run Code Online (Sandbox Code Playgroud)
它只会解析 JSON 文件一次,然后生成.line
文件中的每个值。(您可能仍然想使用-b
命令行选项或其他解决方法,具体取决于您打算对输出执行的操作。)
归档时间: |
|
查看次数: |
8649 次 |
最近记录: |