공백이 줄 바꿈처럼 에코되는 이유는 무엇입니까?

공백이 줄 바꿈처럼 에코되는 이유는 무엇입니까?

내가 얻은 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 '.[]'`다음이 수행됩니다.

  1. 명령을 실행하십시오 cat $PWD/$1 | jq -cr '.[]'. 그건 그렇고, jq -cr '.[]' <"$1"이 변형이 깨지지 않는다는 점을 제외하면 이것은 작성하는 방법이 지나치게 복잡합니다.$1특정 특수 문자가 포함된 경우또는 절대 경로입니다.
  2. 결과 문자열을 공백으로 구분된 세그먼트로 분할합니다. 귀하의 질문은 명확하지 않지만 개행으로 구분된 섹션을 기대하는 것 같습니다. 이는 인용되지 않은 대체 기능이 아닙니다.
  3. 각 부분을 와일드카드 패턴으로 처리하고, 하나 이상의 파일 이름과 일치하는 경우 해당 부분을 일치하는 파일 이름 목록으로 바꿉니다.

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 명령에 하나씩 전달하고 기본적으로 명령이 실행될 때마다 후행 줄 바꿈이 추가됩니다.

관련 정보