2017-05-24 12 views
0

複数の一致を含むクエリの最初のインデックスを取得するにはどうすればよいですか?私は、このクエリでELEMENTと呼ばれる最初のキーの値を取得しようとしています:ここでjqを使用して複数の一致を解析するにはどうすればよいですか?

``` 
{ 
    "ELEMENT": "FADC6B14-0369-4FF4-9ADC-A5E0F5C6D30D", 
    "type": "XCUIElementTypeStaticText", 
    "label": "this.com" 
} 
{ 
    "ELEMENT": "CC89DD73-AB90-495E-A90B-74722C56DD46", 
    "type": "XCUIElementTypeStaticText", 
    "label": "this.com" 
} 
{ 
    "ELEMENT": "B888ADA6-4209-44C4-BCB8-F5174312D102", 
    "type": "XCUIElementTypeStaticText", 
    "label": "this.com" 
} 
{ 
    "ELEMENT": "9A6E77C7-E93D-41DE-9163-2CB60B8DD2FB", 
    "type": "XCUIElementTypeStaticText", 
    "label": "this.com" 
} 
``` 

この結果生成cURLのです。私はそれがlabel[0]=="this.com"可能性が考えていた

curl -X POST $JSON_HEADER -d "{\"using\":\"partial link text\",\"value\":\"label=this.com\"}" $DEVICE_URL/session/$SESSION_ID/elements | jq -r '.value[] | select(.label=="this.com")' 

をが、私はメッセージを受け取ります数値で文字列をインデックスできません

+1

無関係が、部分的リンクテスト "、" value ":" label = this.com "} ''または '" $(jq -n' {部分リンクテスト "を使用して" : "label = this.com"} ') "' '-d'引数のJSONを作成します。 – chepner

答えて

2

.valueには配列が含まれているようです。もしそうなら、あなたの記述に一致JQクエリは次のようになります。

.value | map(select(.label=="this.com")) | .[0] 

一致しない場合、これはnullが生成されますので、あなたはそれに応じて調整を行うこともできます。

あなたが最初の試合で.ELEMENTの値が必要な場合は、あなたが考えることができます:

.value | map(select(.label=="this.com")) | .[0] // empty | .ELEMENT 

をごJQがfirst/1を持っている場合は、より効率的なソリューションが可能です:

first(.value[] | select(.label=="this.com")) | . ELEMENT 
+0

@peakありがとう!あなたの答えの後半部分が問題を解決しました。私にはっきりしていない唯一のことは、インデックスのあとに "empty"というキーワードでエスケープすることです。あなたの答えは[0]です。私はhttps://stedolan.github.io/jq/manual/#map(x),map_values(x)を見ましたが、それは明確ではありませんでした。 – JJacquet

関連する問題