我有这样的 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。
不带引号的命令替换
`cat $PWD/$1 | jq -cr '.[]'`
执行以下操作:cat $PWD/$1 | jq -cr '.[]'
。顺便说一句,这是一种过于复杂的写作方式,除了如果包含某些特殊字符或者是绝对路径jq -cr '.[]' <"$1"
,这个变体不会中断。$1
第 2 步和第 3 步通俗地称为“split+glob 运算符”,这几乎不是您想要的。除非您确切知道为什么需要省略引号,否则请始终在变量和命令替换周围使用双引号。
要在 shell 中逐行处理文件,请使用
while read
循环:但是你最好不要使用其他工具。Shell 本身并不擅长处理大量的字符串数据。
默认情况下,
echo
始终输出尾随换行符。您可以将
-n
参数传递给以echo
防止它这样做。来自
man echo
:编辑:
这里的“问题”不在您的
cat $PWD/$1 | jq -cr '.[]'
命令中,而是echo
在行本身,或者更准确地说,在for
循环中。使用for
循环,您将jq
逐字拆分传递给它的内容(命令的输出)。因此,本质上,您将每个由空格分隔的单个字符串逐个传递给 echo 命令,默认情况下,每次执行时都会添加一个尾随换行符。