with
아래 샘플 파일이 필요합니다 .
참고로 보안 환경에서 실행되기 때문에 여기에 회사 코드를 붙여넣을 수 없으므로 허용되지 않지만 내 문제는 다소 비슷합니다. 값에서 특정 문자열을 가져와야 합니다. 도와주세요
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "**Chocolate with Sprinkles**" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
답변1
jq -r '.topping[] | select(.id == "5006").type / " " | .[1]' file.json
이는 topping
문자열과 동일한 배열 요소를 선택하고 여기에서 키 값을 추출합니다. 그런 다음 값을 공백으로 분할하고 두 번째로 생성된 단어를 추출합니다. 출력되어 표준 출력으로 디코딩됩니다.id
5006
type
흥미로워 보인다 면 / " "
해당 부분을 로 대체할 수 있으며 | split(" ")
이는 보다 명확한 목적을 갖습니다. 또는 | scan("\\S+")
문자열에 선행 또는 후행 공백이 있거나 공백 이외의 공백 문자가 있거나 단어 사이에 여러 공백 문자가 있는 경우 공백이 아닌 문자의 시퀀스를 추출합니다.
확실하지 않은 경우어디문서에서 문자열은 문자열이지만 type
문자열과 동일한 객체의 값이므로 사용할 수 있습니다.id
5006
jq -r '.. | select(.id? == "5006").type / " " | .[1]' file.json
이는 모든 값과 키에 대해 반복되므로(매우 비효율적임) id
value 키가 있는 모든 항목을 선택합니다 5006
. 그런 다음 위의 최상위 변형과 같습니다.
with
질문의 데이터가 주어지면 두 표현식 모두 표준 출력에 단어를 생성합니다.
답변2
키 이름 등 알고 있는 정보를 제공하지 않았지만 잘라내기를 허용하는 경우 최선의 추측은 다음과 같습니다.
cat testjq.json | jq -r '.topping[] | select(.id == "5006" )' | grep type | cut -d "\"" -f 4 | cut -d " " -f 2