私は次の文字列を持っています:
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
そして、この例では1234である「スキームバージョン」の値を取得する必要があります。
私が試してみました
grep -Eo "\"scheme_version\":(\w*)"
しかし、それは戻ります
"scheme_version":1234
どうすればできますか? sed callを追加できることは知っていますが、単一のgrepでそれを行うことを好みます。
これはあなたのために働くかもしれません:
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
アサーションの後ろを見て、一致に含まれないようにする必要があります。
grep -Po '(?<=scheme_version":)[0-9]+'
ジョブには jq を使用することをお勧めします。 jqはコマンドラインJSONプロセッサです。
$ cat tmp
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}
$ cat tmp | jq .scheme_version
1234
SiegeXによって提案されたポジティブルックビハインドメソッドの代替として、scheme_version":
エスケープシーケンスで\K
の直後に一致開始点をリセットできます。例えば。、
$ grep -Po 'scheme_version":\K[0-9]+'
これは、scheme_version":
に一致した後、一致プロセスを再起動し、肯定的な後読みよりもはるかに優れたパフォーマンスを持つ傾向があります。 regexp101の2つを比較すると、リセットマッチスタートメソッドは37ステップと1ミリ秒かかりますが、ポジティブルックビハインドメソッドは194ステップと21ミリ秒かかります。
regex101 でパフォーマンスを自分で比較できます。また、 PCREドキュメンテーション で一致開始点のリセットに関する詳細を読むことができます。
GNU grep
で利用可能なgrep
s 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
あなたはこれを行うことができます:
$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}'