从Ansible regex_search重组多个捕获组

xdyibdwo  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(128)

我检索到一个版本字符串到'myvar'像00001.00022.00333我想移动到我的字典为1.22.333
正则表达式非常简单,但我无法重新组装捕获组。有人能解释一下如何解决这个问题吗?

set_fact:
  cacheable: yes
  mydict: "{{ mydict | combine({ 'version': myvar | regex_search('0*(\\d+)\\.0*(\\d+)\\.0*(\\d+)', '\\1.\\2.\\3') }) }}"

上面代码的输出是[“1”](数组)而不是“1.22.333”。

c2e8gylq

c2e8gylq1#

使用 regex_replace。如果你把反斜杠放在单引号里,就不需要转义它。比如说,

mydict: "{{ {'version': myvar|regex_replace(md_regex, md_replace)} }}"
  md_regex: '0*(\d+)\.0*(\d+)\.0*(\d+)'
  md_replace: '\1.\2.\3'

mydict:
    version: 1.22.333

同样的结果也可以在没有regex的情况下实现。比如说,

mydict: "{{ {'version': myvar.split('.')|map('int')|join('.')} }}"

用于测试的完整剧本示例

- hosts: all

  vars:

    myvar: 00001.00022.00333

    mydict: "{{ {'version': myvar|regex_replace(md_regex, md_replace)} }}"
    md_regex: '0*(\d+)\.0*(\d+)\.0*(\d+)'
    md_replace: '\1.\2.\3'

    mydict2: "{{ {'version': myvar.split('.')|map('int')|join('.')} }}"

  tasks:

    - debug:
        var: mydict

    - debug:
        var: mydict2

问:“在任务中显示所有这些的工作示例,包括任务中的变量。"
答:简单地将变量放入任务级别的 vars

- debug:
        msg: "{{ {'version': myvar|regex_replace(md_regex, md_replace)} }}"
      vars:
        myvar: 00007.00088.00999
        md_regex: '0*(\d+)\.0*(\d+)\.0*(\d+)'
        md_replace: '\1.\2.\3'

msg:
    version: 7.88.999

请参阅:

  • 了解变量优先级
  • 7.3.2.单引号样式
  • 7.3.1.双引号样式

相关问题