2017-05-19 15 views
1

私は変数に返されるjsonを持っていますが、私はjsonの値を取得しようとしています。私は、grepのに限定セッド、および 正規表現のパターンマッチングの改良

RESULTS='{ "results" : [ { "repo" : "appdeploy", "path" : "org/test/cxp/python/1.0-SNAPSHOT", "name" : "python-1.0-20170519.130808-42.jar" } ], "range" : { "start_pos" : 0, "end_pos" : 1, "total" : 1 } }' 
echo $RESULTS | grep -o '"path" : "(.*)",' 

は私に

"path" : "org/test/cxp/python/1.0-SNAPSHOT", 

と正直に私がしたい部分のみがここであなたが行く

org/test/cxp/python/1.0-SNAPSHOT 
+1

[ 'jq'](https://stedolan.github.io/jq/)でJSON値を解析した方が良いですが、場合、あなた'grep -oP '(?<=" path ":")[^ "] +'' –

+0

私は 'jq'へのアクセス権がありません。私はあなたが提案したものを試してみるでしょうありがとう! – ndrone

+0

パーフェクト!ありがとう! – ndrone

答えて

1

sed 's/path : //g'ストリップjqでの"path" : "org/test/cxp/python/1.0-SNAPSHOT"を生成echo $RESULTS | grep -op '"path" :\s"[^"]*"'を行うことによって、あなたは'.results[0] | .path'フィルタを使用することができます。 this tool online hereで遊んでもよいでしょう。

しかし、あなたはjqへのアクセス何を持っていない場合、あなたは

grep -oP '(?<="path" : ")[^"]+' 

ようPCREベースgrepコマンドを使用することができ-Pオプションは、パターンのみをチェックしlookaroundsを使用することができPCRE正規表現構文の使用を可能にします一致していますが、一致したテキストは返された一致値に含めません。

パターンが

  • (?<="path" : ")詳細 - "path" : "サブ
  • [^"]+と先行する位置に一致する正の後読み - 一致し、消費否定ブラケット発現を(に追加します一致値)"以外の1つ以上の文字。

    RESULTS='{ "results" : [ { "repo" : "appdeploy", "path" : "org/test/cxp/python/1.0-SNAPSHOT", "name" : "python-1.0-20170519.130808-42.jar" } ], "range" : { "start_pos" : 0, "end_pos" : 1, "total" : 1 } }' 
    echo $RESULTS | grep -oP '(?<="path" : ")[^"]+' 
    

    印刷org/test/cxp/python/1.0-SNAPSHOT

online grep demo参照してください。

+0

私はregex101を使用しようとしていたideone.comという新しいツールを見つけたと思う。私が働いていたものの始まりを与えたが、 'grep' regexはregex101と同じものではありませんでした。 – ndrone

+0

Regex101は素晴らしいサイトですが、1)PHP/JS/Pythonをサポートしており、自分自身が知っておかなければならない独自のバグ/制限があります。このサイトは、このパターンやパターンがどのように機能するか見るために使用できますが、パターンが機能しているかどうかを確認するには、ターゲット環境でテストする必要があります。@ ndrone:うまく機能する場合は、upv​​otingを受け入れることを検討してください。 –

0

で、使用して結果を返すawkによgrepとsedの両方:

echo $RESULTS | grep -op '"path" :\s"[^"]*"' | sed 's/"//g' | sed 's/path : //g' 

まず、二重引用符アウトsed 's/"//g'ストリップへの最初の呼び出しと2回目の呼び出しアウトpath :

0

これらのタイプのものにはJSONパーサーを使用することをお勧めします。

Python、Ruby、Perlにはすべて、堅牢なJSONパーサーが用意されています。ここで

は、Pythonでの例です:

$ python -c ' 
import json 
import fileinput 

print json.loads("".join(line for line in fileinput.input()))["results"][0]["path"] 
' <<<$(echo "$RESULTS") 
org/test/cxp/python/1.0-SNAPSHOT