큰따옴표를 이스케이프하지 않고 올바른 json 형식을 얻을 수 있습니까?

큰따옴표를 이스케이프하지 않고 올바른 json 형식을 얻을 수 있습니까?

httpie를 사용하여 json 데이터를 제출하고 싶습니다.

큰따옴표를 사용하고 키를 둘러싼 큰따옴표를 이스케이프하면 작동합니다.

json="[ \
    { \
        \"count\": 3 \
    } \
]"

echo $json

[ { "개수": 3 } ]

하지만 나는 탈출하고 싶지 않습니다. 다음은 복사하여 붙여넣기가 더 쉽지만 작동하지 않습니다.

json='[ \
    { \
        "count": 3 \
    } \
]'

echo $json

[ \ { \ "개수": 3 \ } \ ]

그렇다면 json 키를 둘러싼 큰따옴표를 이스케이프하지 않고 어딘가에서 복사하여 붙여넣기를 더 쉽게 만들 수 있습니까?

답변1

~ 안에

var="foo\
bar"

시퀀스 \<newline>는 큰따옴표 안에는 특별하지만 작은따옴표 안에는 특별하지 않습니다.제거됨, 그래서 $var포함합니다 foobar.

당신이 할 때 :

echo $json

분할+glob 연산자(확장을 인용하는 것을 잊었을 때 호출되는 암시적 연산자)를 사용하고 있습니다. 즉, 의 내용이 의 $json문자로 분할되고 $IFS각 단어가 파일 이름 생성(일명 globbing)에 적용됩니다.

기본값에는 $IFS공백 탭과 개행 문자가 포함되어 있습니다(그리고 공백, 탭 및 개행 문자도 분할과 관련하여 특별한 처리를 받습니다. 즉, 그 순서는 1처럼 계산되고 선행 및 후행 항목은 무시됩니다). 예를 들어 다음과 같습니다.

var='  foo  *
bar'

echo $var

$var먼저 foo, *bar(나뉘다부분) *현재 디렉터리(글로브부분).

콘텐츠를 있는 그대로 표시하려면(하지만 많은 echo구현으로 인해 콘텐츠가 엉망이 될 수 있다는 점에 유의하세요) 다음과 같이 작성합니다.

$ echo "$json"
[     {         "count": 3     } ]

이제 간격을 압축하려는 의도라면 분할+글로브 연산자를 유리하게 사용할 수 있습니다.

json='
  [
    {
      "count": 3
    }
  ]'

unset -v IFS # make sure we get a default splitting behaviour.
             # an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part

echo $json # use the split+glob operator

echo공백으로 구분된 인수를 출력하므로 공백, 탭 또는 개행 문자의 모든 시퀀스는 사실상 단일 공백 ​​문자로 대체됩니다(제거될 선행 및 후행 문자는 제외하고 echo끝에 하나의 개행 문자를 추가합니다). 그래서 당신은 얻을 것이다 :

[ { "count": 3 } ]

어쨌든 공백이 따옴표 안에 있는지 여부를 구별하지 않으므로 json 데이터의 의미가 변경될 수 있습니다( 예를 들어 "foo bar"다음과 같이 변환됨 "foo bar").

개행 문자를 이스케이프(제거)하기 위해 시퀀스를 사용하고 \<newline>큰따옴표 문자를 이스케이프할 필요 없이 다른 공백 문자를 유지하려면 여기 문서를 사용할 수 있습니다.

json=$(cat <<EOF
  [\
    {\
      "count": 3\
    }\
  ]
EOF
)
echo "$json"

다음을 제공합니다.

  [    {      "count": 3    }  ]

(개행 문자는 제거되었지만(백슬래시를 앞에 추가하지 않음으로써 일부를 보존하도록 선택할 수도 있음) 다른 공백 문자는 그대로 유지되었습니다.)

답변2

따옴표 안에 줄을 이어가기 위해 백슬래시가 필요하지 않습니다. 두 번째 예에서 백슬래시는 매우 해롭습니다. 작은따옴표 안에 백슬래시가 그대로 유지되어 문자열 구문이 유효하지 않게 되기 때문입니다. 백 슬래시를 제거하면 작동합니다.

관련 정보