【问题标题】:Regex search in JQJQ 中的正则表达式搜索
【发布时间】:2021-04-05 15:55:04
【问题描述】:

我正在我的jq 查询中寻找一个正则表达式(使用。这是一个非常简单的表达式,我想匹配以数字\d(或[0-9])开头并以linux 结尾的条目。到目前为止我尝试过的:

versions=`echo $allversions| jq '.tags[] | select(startswith("\d")) | select(endswith("linux"))'`

但我不认为startwith 不支持正则表达式。我读到match 支持正则表达式,但我找不到有关它的适当文档或示例。一个简单的'jq '.tags[]| match("\d.*linux")' 不起作用并给出语法错误消息:

syntax error near unexpected token `"\d*linux"'

我怎样才能做到这一点?还是应该将jqsed 结合起来?

仅供参考:

$ jq --version
jq-1.6

【问题讨论】:

  • 顺便说一句,echo $allversions 本身就是错误的。见I just assigned a variable, but echo $variable prints something else。总是,总是引用你的扩展:echo "$allversions"——看看如果你的JSON包含一个带有*的字符串被空格包围会发生什么(并且你正在使用一个符合POSIX的shell,特别是不 zsh)否则。
  • ...也就是说json='{"key": "this is * a string"}'; echo $json可以将当前目录下的文件列表注入到你的字符串中。 (不是不​​带引号的扩展会破坏字符串的唯一方式,而是一种更具戏剧性的方式)。

标签: regex jq


【解决方案1】:

正则表达式函数的参数必须是 JSON 字符串,因此任何正则表达式反斜杠都必须转义。因此,而不是match("\d.*linux") 你会写:

match("\\d.*linux")

【讨论】:

    【解决方案2】:

    好的,我找到了方法!

    jq -r '.tags[] | select(test("^[0-9].*linux"))'
    

    【讨论】:

    • 您希望末尾的$ 等同于endswith。现在,如果 linux 在字符串中的任何位置,这将成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2013-05-24
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多