다른 답변을 보았지만 이를 수행하는 방법에 대한 적절한 설명을 얻을 수 없습니다.
라는 문자열 id
변수가 있습니다 id='{"name":"john"}'
. 이 문자열에서 다음과 같은 두 개의 변수를 어떻게 얻을 수 있습니까?
key="name"
value="john"
bash의 문자열 구문 분석을 이해하고 싶기 때문에 자세한 설명을 주시면 감사하겠습니다.
지금까지 {}
문자열에서 중괄호를 제거했습니다.
id="$( echo "${id}" | tr -d {} )"
"
오류가 발생하기 때문에 거기에 포함시킬 수 없습니다 . 여전히 비슷한 것을 찾고 있으며 id.split(":")
결국 배열로 끝났습니다.
답변1
당신이 이것을 요청했으므로 understand string parsing in bash
그것을 염두에 두고 답변을 쓰겠습니다.문제의 해결책이 잘못되었습니다.. bash 자체를 사용하여 원하는 것을 수행할 수 있습니다.만약에당신은정말 깨끗해요특수 문자가 없는 데이터특별한다음 이외의 것으로 정의됩니다 [A-Za-z0-9 ]
.
$ id='{"name":"john"}'
$ id="${id#*\{}" # remove everything through the first '{'
$ echo $id
"name":"john"}
$ id="${id%\}*}" # remove everything starting with the last '}'
$ echo $id
"name":"john"
$ name="${id%:*}" # take everything before the ':'
$ name="${name//\"/}" # remove quotes
$ echo $name
name
$ value="${id#*:}" # take everything after the ':'
$ value="${value//\"/}" # remove quotes
$ echo $value
john
이는 "매개변수 확장"에 설명되어 있습니다.배쉬 매뉴얼. 예를 들어 ${parameter#word}
이렇게 하면 의 시작 부분에서 텍스트가 제거됩니다 Remove matching prefix pattern
. 마찬가지로 접미사를 제거하십시오. 문자열의 모든 항목을 다음 항목으로 바꿉니다(위의 예에서 따옴표(표시되도록 이스케이프해야 함)는 빈 문자열로 대체됩니다). 그러나 각 교체를 개별적으로 수행해야 합니다. 시작 부분을 제거할 수는 없습니다.word
$parameter
%
//
${foo//\"/}
\"
그리고명령으로 문자열을 종료합니다.
}
, {
및 같은 특수 문자를 이스케이프해야 한다는 것을 알 수도 있습니다 "
. 올바르게 수행하는 것을 기억하는 한, 다음을 수행할 수 있습니다.쓰다이와 같은 코드는 작성하기 쉽지만 단순함에도 불구하고 단지 코드를 작성하는 경향이 있습니다. 1~2년 후에 이 코드를 다시 사용하여 재사용하면 다음과 같은 내용을 보고 #*\{}
스스로 생각하게 될 것입니다.이것은 무엇을 의미 하는가?그런 다음 맹목적으로 새 프로젝트에 복사하면 예상치 못한 특수 문자가 나타나기 때문에 코드가 미묘한 방식으로 중단됩니다.
위의 예는 이름/값 쌍에 중괄호, 이스케이프된 따옴표, 콜론 등의 특수 문자 또는 기타 문자가 포함된 경우 중단됩니다. 따라서 이것은 빠르고 지저분한 스크래핑이나 80%의 사용 사례에 효과적이지만 프로덕션이나 모든 입력에 대해 항상 작동하는지 확인해야 하는 경우에는 실제로 사용해서는 안 됩니다.
echo
무슨 일이 일어나고 있는지 보여주는 문이 없더라도 이 코드가 올바르게 수행하는 방법을 보여주는 다른 답변의 예보다 이미 길다는 것을 알 수 있습니다. 따라서 타사 도구를 사용하지 않으면 더 많은 코드를 작성해야 하고, 작성 및 디버깅에 더 오랜 시간이 걸리며, 결국 덜 유연한 솔루션을 사용하게 될 것입니다.~ 할 것이다예상치 못한 일이 발생하면 무너집니다.
답변2
사용 jq
:
id='{"name":"john"}'
key=$(jq -r keys[] <<<"$id")
value=$(jq -r .[] <<<"$id")
-r
: 이 옵션을 사용하면 필터 결과가 문자열인 경우 인용된 JSON 문자열 형식이 아닌 표준 출력에 직접 기록됩니다.
keys
: 내장 기능 키는 객체가 주어지면 해당 키를 배열로 반환합니다.
사용 json
:
id='{"name":"john"}'
key=$(json -ak <<<"$id")
value=$(json -a "$key" <<<"$id")
-a
입력을 배열로 처리
-k
키 값 반환
답변3
또는 보행 경로 기반 UNIX 유틸리티를 사용할 수 있습니다. jtc
:
id='{"name":"john"}'
bash $ key=$(jtc -w'[0]<>k' <<<"$id")
bash $ echo $key
"name"
bash $ value=$(jtc -w'[0]' <<<"$id")
bash $ echo $value
"john"
bash $
jtc
PS> 공개: 저는 JSON 조작을 위한 -shell cli 도구를 만든 사람입니다.