내가 얻은 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"
이 변형이 깨지지 않는다는 점을 제외하면 이것은 작성하는 방법이 지나치게 복잡합니다.$1
특정 특수 문자가 포함된 경우또는 절대 경로입니다. - 결과 문자열을 공백으로 구분된 세그먼트로 분할합니다. 귀하의 질문은 명확하지 않지만 개행으로 구분된 섹션을 기대하는 것 같습니다. 이는 인용되지 않은 대체 기능이 아닙니다.
- 각 부분을 와일드카드 패턴으로 처리하고, 하나 이상의 파일 이름과 일치하는 경우 해당 부분을 일치하는 파일 이름 목록으로 바꿉니다.
2단계와 3단계는 구어적으로 "split+glob 연산자"로 알려져 있습니다.이것은 당신이 원하는 거의 없습니다.따옴표를 생략해야 하는 이유를 정확히 알지 않는 한 변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오..
셸에서 파일을 한 줄씩 처리하려면 다음을 사용하세요.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 명령에 하나씩 전달하고 기본적으로 명령이 실행될 때마다 후행 줄 바꿈이 추가됩니다.