2014-03-07 12 views
5

Ich bin sehr erfahren mit Regex, kann aber nicht herausfinden, warum das nicht funktioniert.Grep: ungültige Anzahl der Wiederholungen

Mein Beispieltext:

{ 
    "coord": 
    { 
     "lon":-74.01, 
     "lat":40.71 
    }, 
    "sys": 
    { 
     "message":0.2452, 
     "country":"United States of America", 
     "sunrise":1394191161, 
     "sunset":1394232864 
    }, 
    "weather": 
    [ 
     { 
      "id":803, 
      "main":"Clouds", 
      "description":"broken clouds", 
      "icon":"04n" 
     } 
    ], 
    "base":"cmc stations", 
    "main": 
    { 
     "temp":270.54, 
     "pressure":1035, 
     "humidity":53, 
     "temp_min":270.15, 
     "temp_max":271.15}, 
     "wind": 
     { 
      "speed":2.1, 
      "deg":130}, 
      "clouds": 
      { 
       "all":75 
      }, 
      "dt":1394149980, 
      "id":5128581, 
      "name":"New York", 
      "cod":200 
     } 
    } 
} 

Ich versuche weather[0].id zu greifen.

Mein vollständiger Skript (die curl erhält die JSON):

curl -s "http://api.openweathermap.org/data/2.5/weather?q=NYC,NY" 2>/dev/null | grep -e '"weather":.*?\[.*?\{.*?"id": ?\d{1,3}' 

bekomme ich immer die Fehler

grep: invalid repetition count(s) 
+2

Haben Sie darüber nachgedacht, stattdessen ein JSON-Tool oder das XML-API und ein XML-Tool zu verwenden? –

+0

Versuchen, dies so leicht wie möglich zu halten - und ich kannte keine solchen Tools für Bash – jdotjdot

+0

Wenn andere sich wundern, ist ['jq'] (https://stedolan.github.io/jq/) ein großartiges CLI JSON-Tool. – orlade

Antwort

9

grep -e nicht \d als Ziffern nicht erkennt. Es erkennt nicht-gierige Formen wie .*? nicht. Für den grep Teil Ihres Befehl versuchen:

grep -e '"weather":[^[]*\[[^{]*{[^}]*"id": *[0-9]\{1,3\}' 

Alternativ ist es Ihre grep unterstützt (GNU), verwenden Sie die -P Option für Perl-wie regex und Ihre ursprüngliche Regex funktioniert:

grep -P '"weather":.*?\[.*?\{.*?"id": ?\d{1,3}' 
Verwandte Themen