2011-12-22 17 views
36

をキャプチャグループ:はgrep:私は、文字列、次のしている

{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 

と私は、この例では1234である「スキームバージョン」の値を取得する必要があります。

しかし私はそれが

"scheme_version":1234 

どのように私はそれを作ることができますを返す

grep -Eo "\"scheme_version\":(\w*)" 

を試してみましたか?私はsedコールを追加することができますが、私は単一のgrepでやりたいと思います。

+0

「grep」としか考えられないと思います。数年前、私は文字列操作で多くをしました。しばしば、greedを「sed」や「cut」のようなものに配管しました。私はあなたが 'パイピング'と 'カット'コマンドを勉強することをお勧めします。 –

+0

私はgrepを頻繁に使っていませんが、おそらくあなたはhttp://stackoverflow.com/questions/1247812/im-stuck-in-trying-to-htmlの受け入れられた答えに概説されているように、 grep-anything-just-after-name。 –

+1

[jq](https://stedolan.github.io/jq) –

答えて

37

これはあなたのために働くかもしれない:

echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | 
sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p' 
1234 

申し訳ありませんが、それはありませんgrepですので、ご希望の場合はこのソリューションを無視してください。

やgrepに固執し、追加します。

grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2 
+0

それは私のための最良の選択肢のようです。 – lstipakov

52

あなたはそれが試合には含まれないように主張の後ろを見て使用する必要があります:

grep -Po '(?<=scheme_version":)[0-9]+'

+0

を使用しています。grepを取得しました:-Pオプションのサポートがこの--disable-perl-regexpバイナリにコンパイルされません。 – lstipakov

+4

@Stipa PCREサポートなし'\ 1'をサポートしていないので、grepで望むことをすることはできません。 – SiegeX

+1

+1' -P' perl great! – kev

30

私はあなたが仕事のためjqを使用することをお勧めします。 jqはコマンドラインJSONプロセッサです。

$ cat tmp 
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 

$ cat tmp | jq .scheme_version 
1234 
+1

私はjqについて知らずに人生でどのように機能しましたか?ワオ。ありがとう! – brian

-1

あなたがこれを行うことができます:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}' 
+1

このコードブロックはOPの質問に答えるかもしれませんが、このコードが質問のコードとどのように異なるのか、あなたが変更したもの、変更した理由、そしてなぜそれが解決するのか説明すると、問題を他者に導入することはない。 – davejal

14

をSiegeXによって提案された正の後読みの方法に代わる方法として、あなたは直接\Kエスケープシーケンスとscheme_version":後に試合の開始点をリセットすることができます。例えば、

$ grep -Po 'scheme_version":\K[0-9]+' 

これはscheme_version":にマッチした後、マッチング処理を再開し、正の後読みよりもはるかに優れた性能を持っている傾向があります。 regexp101の2つを比較すると、リセットマッチの開始方法は37ステップと1msかかりますが、正のlookbehindメソッドは194ステップと21msかかります。

regex101のパフォーマンスを自分で比較することができます。PCRE documentationでマッチの開始点をリセットする方法について詳しく読むことができます。

+0

これは私が必要としていたものです。ありがとう! – mklbtz

関連する問題