我得到的 JSON 数据如下所示:
[
{
"loginId": "7638749",
"customerprofileDetails": {
"securityQuestions": [
"What is your favorite sports team?",
"What is your favorite song?",
"Who is your favorite artist?"
]
}
}
]
我有一个脚本,我在其中传递该文件作为第一个参数。该脚本如下所示:
for json in `cat $PWD/$1 | jq -cr '.[]'` ; do
echo "$json"
done
由于某种原因,当我运行此脚本时,它会输出以下内容:
> fileFromJson.sh tmp2.json
{"loginId":"7638749","customerprofileDetails":{"securityQuestions":["What
is
your
favorite
sports
team?","What
is
your
favorite
song?","Who
is
your
favorite
artist?"]}}
为什么会有这些换行符以及导致此问题的原因是什么?当我刚运行时cat $PWD/tmp2.json | jq -cr '.[]'
,它会打印出一行。如果这很重要的话,我正在使用 MacOS。
答案1
不带引号的命令替换`cat $PWD/$1 | jq -cr '.[]'`
执行以下操作:
- 运行命令
cat $PWD/$1 | jq -cr '.[]'
。顺便说一句,这是一种过于复杂的书写方式jq -cr '.[]' <"$1"
,只不过这个变体不会破坏if$1
包含某些特殊字符或者是绝对路径。 - 将生成的字符串分成以空格分隔的片段。你的问题不是很清楚,但你似乎期望换行符分隔的部分 - 这不是不带引号的替换的作用。
- 将每一部分视为通配符模式,如果它与一个或多个文件名匹配,则将该部分替换为匹配文件名列表。
第 2 步和第 3 步通俗地称为“split+glob 运算符”,这几乎不是你想要的。始终在变量和命令替换周围使用双引号,除非您确切知道为什么需要省略引号。
要在 shell 中逐行处理文件,请使用while read
环形:
jq -cr '.[]' <"$1" |
while IFS= read -r line; do
printf '%s\n' "$line"
done
但您最好还是使用其他工具。 Shell 本身不擅长处理大量字符串数据。
答案2
默认情况下,echo
始终输出尾随换行符。
您可以将-n
参数传递给 来echo
阻止它这样做。
从man echo
:
-n 不输出尾随换行符
编辑:
这里的“问题”不在你的cat $PWD/$1 | jq -cr '.[]'
命令中,而是在行echo
本身中,或更准确地说,在for
循环中。通过循环,您可以逐字for
拆分传递给它的内容(命令的输出)。jq
因此,本质上,您将由空格分隔的每个字符串一一传递给 echo 命令,默认情况下,每次执行该命令时都会添加一个尾随换行符。