큰따옴표를 이스케이프 처리하지 않고 올바른 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

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

기본값 $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

따옴표 안에 줄을 계속하려면 백슬래시가 필요하지 않습니다. 두 번째 예에서 백슬래시는 작은따옴표 안에 그대로 남아 있어 문자열의 구문이 유효하지 않게 되기 때문에 매우 해롭습니다. 백슬래시만 제거하세요.

관련 정보