使用jq按模式拆分字符串

5
我有一个json对象,其中一个字段的值为"countries-sapi-1.0","inventory-list-api-1.0-snapshot"。
请注意,第一个值中有sapi,而另一个值中有api
使用jq,我该如何获取countries-sapi或inventory-list-api,我的意思是在版本号之前的任何内容。版本可以简单地是1.01.0.1-snapshot等等。

发布一个有效的JSON输入数据。 - RomanPerekhrest
1
版本号是否总是以数字开头,周围没有其他数字,还是总是以数字.数字(1.0或4.7)开头? - Chrᴉz remembers Monica
3个回答

6

我搜索了如何在 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.

如果字符串存储在变量中,然后转换为数组会怎样? - shzyincu

3
看起来你需要学习正则表达式(regex);例如可以参考https://regexone.com/https://github.com/zeeshanu/learn-regex等网站。
在你的特定情况下,你可以开始使用jq:
sub(" *- *[0-9]+\\.[0-9]+.*$"; "")

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

1
对于输入"countries-sapi-1.0",请使用:.[] | match( "\\d"; "ig"),这将给您以下输出:
{
  "offset": 15,
  "length": 1,
  "string": "1",
  "captures": []
}
{
  "offset": 17,
  "length": 1,
  "string": "0",
  "captures": []
}

这里使用第一个对象的偏移值,并尝试从起始位置到接收到的偏移值进行切片。

从开头开始切片:$ jq -c '.[:15]'

在我们的例子中,我们得到了第一个对象的偏移量为15,因此我们使用:15进行切片。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接