2つの文字列間のテキストを抽出する方法

2つの文字列間のテキストを抽出する方法

このような文字列があり、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

したがって、必要なものを実行する最良の方法は、次のものを使用することです。コサロナンダの答え


あなたは読むことができますこれそしてこれ方法を理解できる一致グループ働く

関連情報