jq - печатать начальный и конечный контекст вокруг каждого совпадения? - PullRequest
0 голосов
/ 27 марта 2019

Можно ли напечатать начальный и конечный контекст совпадения в jq?

Скажите, у меня есть следующий JSON:

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

Я хочу иметь возможность сопоставить строку с message=="Validating...", а затем получить следующие n конечные или ведущие объекты из совпадения.

С grep у вас есть опция -C, чтобы получить контекст. Есть ли что-нибудь подобное в jq?

1 Ответ

2 голосов
/ 27 марта 2019

Если объекты в массиве содержат только одну пару ключ-значение, используйте 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
...