このような文字列があり、2つの文字列の間のテキストを抽出しようとしています。
例:
[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]
b12
との間の固有の値を抽出したいのですが、},{m12:
必要な出力はです1
。
試しましたが、sed
期待した結果が得られませんでした。何度も発生したので、わからない場合はb12
アドバイスが役に立ちます。
答え1
入力が有効なJSONであるとします。
[{"a12":12},{"b12":1},{"m12":34},{"b12":2},{"k12":45}]
jq
...キーを使用して最上位配列の最初の要素を抽出し、その要素からb12
キー値を抽出するために使用できます。
jq 'map(select(has("b12"))) | first.b12' file
キー名をコマンドライン引数として渡します。
jq --arg k 'b12' 'map(select(has($k))) | first[$k]' file
答え2
以下を指定してsed
抽出できます。1
一致グループあなたが提供する文字列の間。ところで、あなたはb12
との間の文字列が欲しいと言ったが、},{m12:
この場合の出力はです:1
。したがって、実際に欲しいのはとの間b12:
のテキストです},{m12:
。
したがって、コードは次のようになります。
echo '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]' | sed 's/.*b12:\(.*\)},{m12:.*/\1/'
または
sed 's/.*b12:\(.*\)},{m12:.*/\1/' <<< '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]'
このモードは、以前に持っていたすべてのものをs/.*b12:\(.*\)},{m12:.*/\1/
置き換えます(b12:
.*b12:)とそれ以降のすべての項目も置き換えられます},{m12:
(},{m12:.*) 一致するグループ別。一致\(.*\)
グループ(あなたの場合1
)パターンは\1
これを示します。
ノート
このsed
コマンドを使用すると、次のことが発生する可能性があります。「質問」。たとえば、次の追加コンテンツがあるとしますm12
。
'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:45}]'
'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:10},{m12:45}]'
出力は(それぞれ)次のようになります。
2
2},{m12:10
したがって、必要なものを実行する最良の方法は、次のものを使用することです。コサロナンダの答え