(Macターミナル)sedはJSONを解析しています...私は何が間違っていますか?

(Macターミナル)sedはJSONを解析しています...私は何が間違っていますか?

Mac端末でJSONレスポンスの「name」を解析しようとしています。

{"created_at":"2012-08-27T20:04:27Z","deleted_at":null,"id":21462840,"item_type":"video","name":"CastingBy-v12 mix.mov", "private":true,"redirect_url":null,"remote_url":"http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov","source":"Cloud/1.5.4 CFNetwork/520.4.3 Darwin/11.4.0 (x86_64) (MacPro5%2C1)","updated_at":"2012-08-27T20:13:38Z","view_counter":2,"href":"http:/ / /my.cl.ly/items/2840","icon":"http://my.cld.me/images/item-types/video.png","購読":true,"url": " http://files.housenyc.com/1I3E2F3C","content_url":"http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov","download_url":"http://files . eeehousenyc .com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov","gauge_id":null}

私はそれを使用しています

sed 's/{.*?"name":"\(.+?\)".*/\1/'

ただし、文字列全体を返します。

帰ってきたらいいな

CastingBy-v12 mixed.mov

答え1

sedだけを使ってjsonを解析するのは、HTMLを解析するのと同じくらい問題があります。つまり、要素を他の要素に含めることができ、正規表現が再帰をサポートしていないため、正規表現のみを使用して正しく解析することは本質的に不可能です。

以下は、jsonを解析して検証するためのPCREソリューションです。https://stackoverflow.com/questions/2583472/regex-to-validate-json- まだ使ったこともなく、テストしたこともなくて効果があるという作家の言葉を受け入れなければならないのに...しかし、PCRE は、sed がサポートする基本または拡張正規表現で見つからない多くの操作を実行します。

とにかく、IMOでは、Perl、Python、またはawkとその言語のjson解析ライブラリのいずれか、または専用のjson解析ツールを使用することをお勧めします。ここではいくつか言及されています。

https://stackoverflow.com/questions/3858671/unix-command-line-json-parser

これらの1つは、シェルスクリプトで使用するためにJSON入力からデータを抽出するために使用できます。あるいは、プログラム全体をその言語で書くこともできます。

たとえば、jsonデータをpython -mjson.toolにパイピングすると、次のような結果が得られます。

$ echo "JSONDATAここ" python -m json.tools |
{
    "content_url": "http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov",
    "作成時間": "2012-08-27T20:04:27Z",
    "削除_at":空、
    "download_url": "http://files.eeehousenyc.com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov",
    "gauge_id": 空、
    "href": "http://my.cl.ly/items/2840",
    "アイコン": "http://my.cld.me/images/item-types/video.png",
    「身分証明書」:21462840、
    "item_type": "動画",
    "name": "CastingBy-v12 mix.mov",
    「プライベート」:実際、
    "redirect_url": 空、
    "remote_url": "http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov",
    "ソース": "クラウド/1.5.4 CFNetwork/520.4.3 ダーウィン/11.4.0 (x86_64) (MacPro5%2C1)",
    「購読中」:実際には、
    "updated_at": "2012-08-27T20:13:38Z",
    "url": "http://files.housenyc.com/1I3E2F3C",
    「ビューカウンター」:2
}

その後、次のように入力をsedにパイプできます。

$ echo "JSONDATAHERE" | python -m json.tool | sed -n -e '/"name":/ s/^.*"\(.*\)".*/\1/p'
CastingBy-v12 mixed.mov

sedスクリプトは、正規表現の貪欲な特性に依存して、含まれる"行の最後から2番目の文字と最後の文字の間のすべての内容を抽出します。 ""name":

答え2

探している表現は次のとおりです。

sed -e 's/^.*"name":"\([^"]*\)".*$/\1/' infile

結果は次のとおりです。

CastingBy-v12 mixed.mov

あなたのエラーにはいくつかのエラーがあります。

  • 貪欲な表現にのみsed許可されています。 :.*?.+?両方が正しくありません。
  • 脱出する必要があります+
  • [^"]*正規表現が文字列の最後の二重引用符と一致するのを防ぐために使用されます。

答え3

これはあなたの質問に直接答えません。ただし、これらの作業を定期的に実行する必要がある場合は、Perl、Python、Rubyなどの汎用プログラミング言語を使用することをお勧めします。

Rubyでは、解決策は次のとおりです。

some_command_that_emits_json | ruby -e "require 'rubygems';require 'json'; output=JSON.parse(STDIN.gets); puts output['name']"

答え4

JSONモジュールを使用してこれを行う1つの方法は次のとおりですperl

 json_producing_process | perl -MJSON -lne 'print from_json($_)->{name}'

関連情報