Kat*_*sai 4 sed text-processing json
我正在使用 Ubuntu,我想提取两个模式之间的值,但所需的字符串不在文件中。
我的数据如下图:
[{"rows":[{"_uuid":["uuid","11111-222-33333-4444444"]}]}]
Run Code Online (Sandbox Code Playgroud)
,
我想要得到和之间的文本]
,这意味着我想要11111-222-33333-444444
。我该如何使用 来做到这一点sed
?
Kus*_*nda 12
使用jq
(不关心输入是紧凑形式还是多行形式):
your-command | jq -r '.[0].rows[0]._uuid[1]'
Run Code Online (Sandbox Code Playgroud)
您的 JSON 文档是一个由对象组成的数组,您需要这些顶级对象中的第一个.[0]
. 该对象包含一个rows
数组,并且您需要它的第一个元素.rows[0]
。该元素有另一个名为 的数组_uuid
,并且您需要该数组的第二个元素._uuid[1]
。
-r
您将得到解码后的“原始”数据。如果没有-r
,您将得到一个(带引号的)JSON 字符串。
从这个特定的JSON 文档获取数据的一种完全不同的方法是获取文档中的最后一个值:
your-command | jq -r 'getpath([paths(scalars)][-1])'
Run Code Online (Sandbox Code Playgroud)
首先使用 生成整个文档中每个标量值的所有“路径” paths
,并选出最后一个。然后,表达式使用最后一个标量的路径来getpath
提取最后一个值。对于给定的文档,这会产生预期的输出。
下面的代码可能做同样的事情,但是使用..
和 with显式递归select()
来提取所有标量值:
your-command | jq -r '[.. | select(scalars)][-1]'
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我会采纳这个答案中最重要的建议,因为它使用文档的结构,这必然在某种程度上对用户有意义。如果任何涉及的数组开始包含更多元素,则必须重新审视该代码,并重新表述问题。