jq-在每个比赛周围打印前导和尾随上下文?

时间:2019-03-27 13:55:32

标签: json jq

是否可以在jq中打印比赛的开头和结尾上下文?

说我有以下JSON:

...
[{
  "message": "Validating...",
},
{
  "message": "Validated.",
},
{
  "message": "Saving...",
},
{
  "message": "Saved.",
}]
...

我希望能够在message=="Validating..."处匹配一个字符串,然后从匹配项中获取下一个n尾随或前导对象。

使用grep,您可以使用-C选项来获取上下文。 jq中是否有类似内容?

1 个答案:

答案 0 :(得分:2)

如果数组下的对象每个仅包含一个键-值对,请使用index来获取匹配的索引:

index({message:"Validating"})

否则:

map(.message == "Validating...")|index(true)

或者使用此更有效的功能:

def find(condition):
    label $out
    | foreach .[] as $p (-1; . + 1
        if $p | condition
        then ., break $out
        else empty end);

然后使用此索引对数组进行切片:

# all leading
.[0:find(.message == "Validating...")]

# all trailing
.[find(.message == "Validating..."):]

# leading three
find(.message == "Validating...") as $i | .[if $i < 3 then 0 else $i - 3 end:$i]

# trailing three
find(.message == "Validating...") as $i | .[$k:$k + 4]

# etc