regex 可列出变量并选择筛选器以忽略匹配项

yk9xbfzb  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(124)

我在ansible playbook中有一个变量dir_lst_raw,其值为 list,如下所示:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path3/dir3/user.ansible_backup_2020-03-16",
        "/path1/dir1/config.ansible_backup_2020-03-16",
        "/path2/dir2/dir3/somefile"
      ]

我需要删除所有包含.ansible_backup_的行,并将其保存到另一个变量 list 中。我已经在谷歌上搜索了正则表达式,并尝试 * 不匹配选择过滤器 * 的模式,如下所示:

- set_fact:
      dir_lst: "{{ dir_lst_flt_r | select('match','(^.ansible_backup_)+') | list }}"

但是新的变量dir_lst变成了一个空列表。我期待dir_lst如下:

"dir_lst_raw": [
        "/path1/dir1/user",
        "/path2/dir2/admin",
        "/path2/dir2/dir3/somefile"
     ]

有人能建议我怎么做吗?

zfycwa2u

zfycwa2u1#

Q:***“删除所有包含.ansible_backup_的行“***
答:您可以使用简单的测试***搜索***。报价:
如果在字符串中的任何地方找到模式,则搜索成功。

dir_lst: "{{ dir_lst_raw|reject('search', dir_lst_search)|list }}"
  dir_lst_search: '\.ansible_backup_'

或者你可以使用test***regex***。
regex的工作方式与search类似,但通过传递match_type关键字参数,regex也可以配置为执行其他测试...

dir_lst: "{{ dir_lst_raw|reject('regex', dir_lst_regex)|list }}"
  dir_lst_regex: '^(.*)\.ansible_backup_(.*)$'

两个选项给予结果相同

dir_lst:
    - /path1/dir1/user
    - /path2/dir2/admin
    - /path2/dir2/dir3/somefile

完整的测试行动手册示例

- hosts: localhost

  vars:

    dir_lst_raw:
      - /path1/dir1/user
      - /path2/dir2/admin
      - /path3/dir3/user.ansible_backup_2020-03-16
      - /path1/dir1/config.ansible_backup_2020-03-16
      - /path2/dir2/dir3/somefile

    dir_lst1: "{{ dir_lst_raw|reject('search', dir_lst_search)|list }}"
    dir_lst_search: '\.ansible_backup_'

    dir_lst2: "{{ dir_lst_raw|reject('regex', dir_lst_regex)|list }}"
    dir_lst_regex: '^(.*)\.ansible_backup_(.*)$'

  tasks:

    - debug:
        var: dir_lst1
    - debug:
        var: dir_lst2

相关问题