2つのパターン間の値の抽出

2つのパターン間の値の抽出

Ubuntuを使用していますが、2つのパターン間の値を抽出したいのに必要な文字列はファイルにありません。

私のデータは次のとおりです。

[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]

,私は間にテキストをインポートしたいと思います。]これは私が欲しいことを意味します11111-222-33333-444444。これを行うにはどうすればよいですかsed

  1. Ubuntu私が使っているオペレーティングシステムです。
  2. どのファイルや変数にも保存されません。これはコマンドの出力です。 command1の出力をsedにパイプし、上記の文字列を解析して必要な情報のみを取得しようとしています。
  3. それにJSON滞在。これが私たちが得る唯一のデータです...

答え1

使用してくださいjq(入力がコ​​ンパクトか複数行かは関係ありません)。

your-command | jq -r '.[0].rows[0]._uuid[1]'

JSONドキュメントはオブジェクトの配列であり、これらの最上位オブジェクトの最初のオブジェクトが必要です.[0]。オブジェクトにはrows配列が含まれており、最初の要素が必要です.rows[0]。その要素の名前が付けられた別の配列があり、_uuidその配列の2番目の要素が必要です._uuid[1]

-rデコードされた「生」データが取得されます。それ以外の場合-r(引用符で囲まれた)JSON文字列を受け取ります。


データをインポートする全く異なる方法特別なJSONドキュメントをインポートします。最後の値ファイルから:

your-command | jq -r 'getpath([paths(scalars)][-1])'

まず、ドキュメント全体ですべてのスカラー値を生成するすべての「パス」を使用し、paths最後の値を選択します。次に、式は最後のスカラーのパスを使用してgetpath最後の値を抽出します。これにより、その文書に対して予想される出力が生成されます。

次のコードは同じことができますが、..withの明示的な再帰を使用してselect()すべてのスカラー値を抽出します。

your-command | jq -r '[.. | select(scalars)][-1]'

個人的には、私はこの答えで最も重要な提案を選択します。なぜなら、この答えは何らかの方法でユーザーに理解できる文書の構造を使用するからです。関連する配列のいずれかがより多くの要素を含め始めると、コードを再確認して問題を再現する必要があります。

答え2

もし私たちが存在すると確信できればいつも1行に1つだけがあり、,その行とその後の最初の行の間のすべての,コンテンツが必要な場合は、次のものを使用できます。]sed

 $ echo '[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]' | sed 's/.*,\([^]]*\)\].*/\1/'
"11111-222-33333-4444444"

または引用符も避けてください。

   $ echo '[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]' | sed 's/.*,"\([^]]*\)"\].*/\1/'
11111-222-33333-4444444

sedただし、これはJSONデータのように見えるため、このソリューションは入力形式を少し変更しても中断されるため、使用しないでください。あなたはする必要があります専用JSONパーサーの使用代わりに良いですjq

答え3

貴重なデータに数字と-のみが含まれている場合は、この機能を使用できます。 (uuidが23より長い場合は問題ありません。)

echo '[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]' | sed  -n "s/.*,\"\([0-9-]\{23,\}\)\"].*/\1/p"

出力:11111-222-33333-4444444

答え4

使用幸せ(以前のPerl_6)

~$ raku -MJSON::Tiny -e 'from-json($_)[0].<rows>[0].<_uuid>[1].put given slurp();'  file

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。コマンドラインフラグに関してraku --helpシェルコマンドラインを呼び出すと、次のことがわかります。

  • このフラグは(下)デフォルトで有効になっている-e「1行」プログラムを実行します。strict

  • この-Mフラグは「one-liner」プログラムを実行する前にモジュールをロードします。この場合はJSON::Tiny

入力例:

[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]

出力例:

11111-222-33333-4444444

モジュールのホームページ(下記の最初、2番目のリンク)によると、JSON::Tiny配列とオブジェクトだけでなく、すべての値を最上位のJSON文字列として受け入れるという点で、ECMA-404の親セットであるRFC7159を実装します。」from-jsonto-jsonOPの入力はおよびモジュール機能を使用して往復することができます。

このラクの回答、特に[0].<rows>[0].<_uuid>[1]下降構造は、JSON優れた回答と驚くほど似ています。最初 jq@Kusalanandaが投稿した回答です。

https://raku.land/cpan:MORITZ/JSON::Tiny
https://github.com/moritz/json
https://raku.org

関連情報