Ubuntuを使用していますが、2つのパターン間の値を抽出したいのに必要な文字列はファイルにありません。
私のデータは次のとおりです。
[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]
,
私は間にテキストをインポートしたいと思います。]
これは私が欲しいことを意味します11111-222-33333-444444
。これを行うにはどうすればよいですかsed
?
答え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-json
to-json
OPの入力はおよびモジュール機能を使用して往復することができます。
このラクの回答、特に[0].<rows>[0].<_uuid>[1]
下降構造は、JSON
優れた回答と驚くほど似ています。最初 jq
@Kusalanandaが投稿した回答です。
https://raku.land/cpan:MORITZ/JSON::Tiny
https://github.com/moritz/json
https://raku.org