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"
}

おすすめ記事