web-dev-qa-db-ja.com

grep:グループキャプチャ

私は次の文字列を持っています:

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

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

私が試してみました

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

しかし、それは戻ります

"scheme_version":1234

どうすればできますか? sed callを追加できることは知っていますが、単一のgrepでそれを行うことを好みます。

50
lstipakov

これはあなたのために働くかもしれません:

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
51
potong

アサーションの後ろを見て、一致に含まれないようにする必要があります。

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

61
SiegeX

ジョブには jq を使用することをお勧めします。 jqはコマンドラインJSONプロセッサです。

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

$ cat tmp | jq .scheme_version
1234
37
Marc O'Morain

SiegeXによって提案されたポジティブルックビハインドメソッドの代替として、scheme_version":エスケープシーケンスで\Kの直後に一致開始点をリセットできます。例えば。、

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

これは、scheme_version":に一致した後、一致プロセスを再起動し、肯定的な後読みよりもはるかに優れたパフォーマンスを持つ傾向があります。 regexp101の2つを比較すると、リセットマッチスタートメソッドは37ステップと1ミリ秒かかりますが、ポジティブルックビハインドメソッドは194ステップと21ミリ秒かかります。

regex101 でパフォーマンスを自分で比較できます。また、 PCREドキュメンテーション で一致開始点のリセットに関する詳細を読むことができます。

23
ClarkZinzow

GNU grep で利用可能なgreps PCRE機能の使用を避けるために、 BSDバージョン で利用できないようにするには、別の方法を使用します- ripgrep 、たとえば.

$ rg -o 'scheme_version.?:(\d+)' -r '$1' <file.json 
1234

-rグループインデックスをキャプチャします(例:$5)および名前(例:$foo)。

Pythonおよび json.tool module 検証およびプリティプリントできる:

$ python -mjson.tool file.json | rg -o 'scheme_version[^\d]+(\d+)' -r '$1'
1234

関連: grepは一致する指定されたグループのみを出力できますか?

5
kenorb

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

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'
2
kris.zhang