提取两个模式之间的值

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

  1. Ubuntu是我正在使用的操作系统。
  2. 它没有存储在任何文件或变量中。这是一个命令的输出。我想将 command1 的输出通过管道传输到 sed 并解析上面的字符串以仅获取所需的信息。
  3. 它是JSON格式。这是我们得到的唯一数据......

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)

就我个人而言,我会采纳这个答案中最重要的建议,因为它使用文档的结构,这必然在某种程度上对用户有意义。如果任何涉及的数组开始包含更多元素,则必须重新审视该代码,并重新表述问题。