jq按模式拆分字符串

时间:2018-03-29 08:55:24

标签: regex split substring jq

我有一个json对象,其中一个字段具有值,例如" 国家/地区 - sapi - 1.0 "," 库存列表 - api - 1.0-snapshot "

Noe,第一个人sapi而另一个人api

使用jq,我如何获得countries-sapi或inventory-list-api我的意思是版本之前的任何内容。版本可以像1.01.0.1-snapshot等一样简单。

3 个答案:

答案 0 :(得分:0)

我是命令行工具JQ的新手但是试图帮助你......

输入:“countries-sapi-1.0”

Use : .[] | match( "\\d"; "ig") will give you the following output

{
  "offset": 15,
  "length": 1,
  "string": "1",
  "captures": []
}
{
  "offset": 17,
  "length": 1,
  "string": "0",
  "captures": []
}


Use first object's offset value and try to slice it from starting position to the received offset. 

slice from beginning    $ jq -c '.[:15]' 

In our case we got 15 as offset for first object so we used :15 for slice.

Hope so this will help you.

答案 1 :(得分:0)

看起来你需要研究正则表达式(正则表达式);例如,请参阅https://regexone.com/https://github.com/zeeshanu/learn-regex或其他几十个。

使用jq,在您的特定情况下,您可以从:

开始
sub(" *- *[0-9]+\\.[0-9]+.*$"; "")

请注意,此处需要两个反斜杠,因为“from”表达式必须(或评估为)有效的JSON字符串。

答案 2 :(得分:0)

我在这里搜索如何用正则表达式而不是jq中的子字符串进行拆分,但是我发现您必须为split函数提供两个参数(其中第二个参数包含用于正则表达式,但它只能是一个空字符串。

$ jq -n '"axxbxxxc"|split("x+";"")'
[
  "a",
  "b",
  "c"
]

从手册:

split
    Splits an input string on the separator argument.

        jq 'split(", ")'
           "a, b,c,d, e, "
        => ["a","b,c,d","e",""]

[...]

split(regex; flags)
    For backwards compatibility, split splits on a string, not a regex.