2017-02-05 188 views
5

這是一個非常基本的(可能是愚蠢的)問題,但我不能讓它工作...模式匹配字段名稱與JQ

我有一個JSON文件,這種結構

{                                                            
    "data": { 
     "what a burger": [1,2,3], 
     "wap": [66], 
     "the map": [11,20], 
     "H. Incandenza": [1,1], 
     "What a burger": [a,a,3] 
    } 
} 

並且我想提取數據中的字段值,其「名稱」匹配特定模式。例如,我想提取「什麼是漢堡」的所有不區分大小寫的巧合讓

[1,2,3],[A,A,3]

我的猜測是什麼像

jq '.data | match("what a burger";"i")' 

但這會導致

jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string 

乾杯。

回答

2

您的聲明不起作用,因爲您嘗試將數據對象提供給匹配,但匹配只能對字符串起作用。

下面的表達式會做你想做的。 to_entries將對象轉換爲一個鍵和值的數組。然後我們通過使用mapselect迭代這個數組,其中.key(現在是字符串)的所有條目都有match。最後我們打印出每個元素的值。

.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value) 

然而,兩點意見:

  • [a,a,3]不JSON不允許的,因爲a不是數字。
  • 它的作用是因爲鍵實際上是不同的,即使只有字母大小寫不相等。如果至少兩個密鑰相同,則會遇到問題,因爲密鑰應該是唯一的。實際上,jq只會輸出其中一個元素。
+1

兩個'map'電話可以並且應該合併。 –

5

這裏有一個稍微簡短的選擇:

.data | with_entries(select(.key|match("what a burger";"i")))[] 

整流輸入,並使用JQ的-c選項之後,這將產生兩行:

[1,2,3] 
["a","a",3] 
+0

我喜歡這個,並幫助我找出所有關鍵值:如果關鍵字包含一個模板(或者是uniq) 對於關鍵字名稱爲「keynameSOMETHING」的所有值 '.data | with_entries(選擇(.key | match(「keyname +」;「ig」)))[]' 對於key:具有相同filer的值,我們只在最後刪除[],甚至在我想要在鍵名中搜索多個PATTERN: '.data | with_entries(選擇(.key | match(「contains1 +」,「contains2 +」;「ig」)))' 不能做到這一點沒有你的建議,儘管@peak所以謝謝 – Mikec