공백이 포함된 json 필드를 검색하는 데 문제가 있으며, 변수에 공백도 포함된 검색어가 포함되어 있습니다. 검색을 사용해 왔지만 contains
전체 구문을 검색하는 방법을 잘 모르겠습니다.
COUNTRY="United States"
CITY='"New York"'
cat testdata | jq --arg COUNTRY "$COUNTRY" --arg CITY "$CITY" -r \
'.wireguard[] | select(.country == $COUNTRY) | select(.city|contains('$CITY'))'
jq 명령을 실행하려고 하면 다음 오류가 발생합니다.
jq: error: syntax error, unexpected $end, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1:
.wireguard[] | select(.country == $COUNTRY) | select(.city|contains("New
jq: 1 compile error
변수에 qoutes가 포함되어 있지만 변수의 공백으로 인해 쿼리가 중지되는 것 같습니다.
저도 시도해 보았 select(.city|contains($CITY))
으나 아무런 결과도 나오지 않았습니다(오류 없음). 그러나 select(.city|contains("New York"))
쿼리는 정상적으로 실행됩니다. CITY
변수의 내용 이 "New York"
.
"포함" 쿼리에서 공백이 포함된 변수를 어떻게 사용합니까?
내가 테스트하고 있는 Json은 다음과 같습니다.
{
"wireguard": [
{
"gateway": "us-ga.wg",
"country_code": "US",
"country": "United States",
"city": "Atlanta, GA",
"isp": "Datapacket"
},
{
"gateway": "us-ca.wg",
"country_code": "US",
"country": "United States",
"city": "Los Angeles, CA",
"isp": "Datapacket"
},
{
"gateway": "us-ny.wg",
"country_code": "US",
"country": "United States",
"city": "New York, NY",
"isp": "M247"
},
{
"gateway": "us-ut.wg",
"country_code": "US",
"country": "United States",
"city": "Salt Lake City, UT",
"isp": "100TB"
},
{
"gateway": "us-fl.wg",
"country_code": "US",
"country": "United States",
"city": "Miami, FL",
"isp": "Quadranet"
},
{
"gateway": "us-nj.wg",
"country_code": "US",
"country": "United States",
"city": "New Jersey, NJ",
"isp": "Quadranet"
},
{
"gateway": "us-nv.wg",
"country_code": "US",
"country": "United States",
"city": "Las Vegas, NV",
"isp": "M247"
}
]
}
답변1
쉘 정의는 CITY
실제로 텍스트에 큰따옴표가 포함되어 있음을 의미합니다. 이것은 아무것도 일치하지 않습니다.
$CITY
is를 매개변수 대신 쉘 변수로 사용합니다 jq
. 또한 사용할 때 따옴표를 사용했기 때문에 쉘이 이를 구문 분석할 수 있으며 JSON은 "New
및 사이의 공백으로 분할됩니다 York"
.
이 시도. 어느 것이 쉘 변수이고 어느 것이 쉘 변수인지 더 명확하게 하기 위해 쉘 변수의 대소문자를 바꿨습니다.jq
country='United States'
city='New York'
jq --arg COUNTRY "$country" --arg CITY "$city" -r \
'.wireguard[] | select(.country == $COUNTRY) | select(.city|contains($CITY))' testdata
산출
{
"gateway": "us-ny.wg",
"country_code": "US",
"country": "United States",
"city": "New York, NY",
"isp": "M247"
}