Jq에는 공백이 포함된 변수가 있는 쿼리가 포함되어 있습니다.

Jq에는 공백이 포함된 변수가 있는 쿼리가 포함되어 있습니다.

공백이 포함된 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실제로 텍스트에 큰따옴표가 포함되어 있음을 의미합니다. 이것은 아무것도 일치하지 않습니다.

$CITYis를 매개변수 대신 쉘 변수로 사용합니다 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"
}

관련 정보