
私が得た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 '.[]'
1行が印刷されます。これが重要な場合は、私はMacOSを使用しています。
答え1
引用符なしでコマンドを置き換えると、`cat $PWD/$1 | jq -cr '.[]'`
次のことが行われます。
- コマンドを実行してください
cat $PWD/$1 | jq -cr '.[]'
。ちなみに、jq -cr '.[]' <"$1"
この変形が壊れないことを除いて、これは作成する方法が複雑すぎます。$1
特定の特殊文字が含まれている場合または絶対パスです。 - 結果文字列をスペースで区切られたセグメントに分割します。あなたの質問は明確ではありませんが、改行で区切られたセクションを期待しているようです。これは引用されていない代替機能ではありません。
- 各部分をワイルドカードパターンとして扱い、1つ以上のファイル名と一致する場合は、その部分を一致するファイル名のリストに置き換えます。
ステップ2と3は、口語的に「split + glob演算子」として知られています。これはあなたが望むことはほとんどありません。引用符を省略する理由を正確に知らない限り、変数とコマンドの置換には常に二重引用符を使用してください。。
シェルでファイルを1行ずつ処理するには、次のようにします。while read
リング:
jq -cr '.[]' <"$1" |
while IFS= read -r line; do
printf '%s\n' "$line"
done
しかし、他のツールを使用する方が良いです。シェル自体は、大量の文字列データを処理するのには適していません。
答え2
デフォルトでは、末尾のecho
改行文字は常に出力されます。
-n
に引数を渡すことでecho
これを防ぐことができます。
からman echo
:
-n 末尾の改行文字を出力しません。
編集する:
ここで、「問題」はcat $PWD/$1 | jq -cr '.[]'
コマンドにあるのではなく、echo
行自体にあるか、より正確にはループにfor
あります。ループを使用すると、渡されfor
た内容(コマンドの出力)を文字通り分割できます。jq
したがって、デフォルトでは、スペースで区切られた各文字列をechoコマンドに1つずつ渡し、デフォルトでコマンドが実行されるたびに末尾の改行が追加されます。