微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

人偶正则表达式引号之间var中的抓取路径

如何解决人偶正则表达式引号之间var中的抓取路径

我有以下Yaml:

function someApiCall(): IApiResponse<MyDataType[]> {
  ...
}

然后我使用以下正则表达式https://regex101.com/r/pVzseA/1获取这些引号之间的值(regex在regex101.com中起作用),但在Puppet中不起作用:

role::project::conf::files:
  entry_01:
    - 'file "/var/project/some_file.txt" 5333;'
    - 'echo no;'
  entry_02:
    - 'file "/var/project/some_other_file.txt" 5334;'
    - 'echo yes;'
  entry_03:
    - 'file "/var/project/extra_file.txt" 5335;'
    - 'echo yes;'

更新,该类:

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    #how to get only the path here in var
  }
}

解决方法

我使用以下正则表达式 https://regex101.com/r/pVzseA/1以获取两者之间的价值 那些引号(regex在regex101.com中起作用)但不起作用 在Puppet中工作:

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    #how to get only the path here in var
  }
}

正如我在评论中指出的,Puppet使用Ruby的正则表达式风格。这不在Regex101明确支持的范围之内,因此毫无疑问,在那里工作的正则表达式不能与Puppet一起使用。但是,Rubular上的Ruby风味在线正则表达式测试器显示,您的特定正则表达式在Ruby中可以正常工作,包括匹配的组。

您没有在Puppet代码中显示如何尝试获取匹配的组,但是在Puppet's regular expression docs中给出了适当的过程。特别是:

在条件语句和节点定义中,带有[sic]的子字符串 正则表达式中的括号()可用编号 相关代码部分中的变量。第一个是$1, 第二个是$2,依此类推。整个比赛以$0的形式提供。这些 不是普通变量,并且具有某些特殊行为:[...]

这也反映在the documentation for conditional statements中。

您只有一个捕获组,因此在条件语句的正文中,您可以将捕获的内容称为$1。例如,

each($files) | $files_itm | {
  if $files_itm[1] =~ /"([^"]*)"/ {
    notify { "file ${1} seen": }
  }
}

但是请注意,捕获组变量只能在条件语句的主体内以及在其条件中具有正则表达式匹配的任何嵌套条件中访问。同样,似乎没有证据表明,如果在同一条件语句的条件中存在两个或多个正则表达式匹配表达式,则意味着什么。

更新

但是问题的更新和您在注释中显示的错误消息表明,您所苦苦挣扎的问题完全不同。与Hiera键role::project::conf::files关联的值是 hash ,具有字符串键和数组值,而您似乎希望根据默认编码到类中的参数来创建数组。当您遍历哈希并在单个变量中捕获条目时,该变量将采用两个元素的数组值,其中第一个(元素0)是条目的键,第二个(元素1)是对应的值。

因此,当问题中显示的Hiera数据绑定到您的$files参数时,表达式$files_itm[1]的计算结果为数组值,例如['file "/var/project/some_file.txt" 5333;','echo no;']。对于=~运算符而言,那些不合适的左操作数,这是错误消息告诉您的内容。

在这里很难说出您真正想要的是什么,但这至少应该避免错误(与您的YAML数据一起使用):

each($files) | $itm_key,$itm_value | {
  if $itm_value[0] =~ /"([^"]*)"/ {
    notify { "file ${1} seen": }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。