【问题标题】:jq split string by a patternjq 按模式分割字符串
【发布时间】:2018-09-08 03:50:13
【问题描述】:

我有一个 json 对象,其中一个字段的值例如“countries-sapi-1.0”、“inventory-list-api-1.0-snapshot

不,第一个有sapi,另一个有api

使用jq,我如何获得国家/地区-sapi 或库存列表-api 我的意思是版本之前的任何内容。版本可以像1.01.0.1-snapshot 等一样简单。

【问题讨论】:

  • 发布有效的 JSON 输入数据
  • 版本是否总是以数字开头并且周围没有其他数字,还是总是以 number.number(1.0 或 4.7)开头?

标签: regex split substring jq


【解决方案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 作为切片。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果将字符串存储在变量中,然后转换为数组呢?
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多