选择列表中属性*不*匹配正则表达式模式的项目

问题描述 投票:0回答:1

我有一个字典列表,例如:

[
  {
    "url": "bucket.amazonaws.com",
    "file": "file1.txt"
  },
  {
    "url": "github.com",
    "file": "file2.txt"
  }
]

我可以过滤结果以使用 AWS 中的文件创建变量:

aws_files: "{{ array | selectattr('url', 'match', '.*amazonaws\\.com.*') }}"

或者Github中的文件:

github_files: "{{ array | selectattr('url', 'match', '.*github\\.com.*') }}"

如何过滤以查找所有匹配上述模式的文件?

这是我所拥有的,但我认为这是不对的:

remaining_files: "{{ not (array | selectattr('url', 'match', '.*(amazonaws|github)\\.com.*')) }}"

这也行不通:

remaining_files: "{{ array | selectattr('url', 'notmatch', '.*(amazonaws|github)\\.com.*') }}"

另外,第二个问题:有没有办法匹配字符串中的模式anywhere(所以我不必总是将

.*
添加到模式的开头/结尾)。

ansible jinja2
1个回答
0
投票

例如,给定列表中的模式

  patterns:
    - .*amazonaws\.com.*
    - .*github\.com.*

和用于测试的数组

array: - {file: file1.txt, url: bucket.amazonaws.com} - {file: file2.txt, url: github.com} - {file: file3.txt, url: example.com}
选择 

awsgithub 文件

aws_files: "{{ array | selectattr('url', 'match', patterns.0) }}" github_files: "{{ array | selectattr('url', 'match', patterns.1) }}"
给予

aws_files: [{'file': 'file1.txt', 'url': 'bucket.amazonaws.com'}] github_files: [{'file': 'file2.txt', 'url': 'github.com'}]
您现在可以减去匹配列表

result: "{{ array | difference(aws_files + github_files) }}"
得到你想要的

result: [{'file': 'file3.txt', 'url': 'example.com'}]
或者,您可以拒绝连接的模式。下面的声明给出了相同的结果

result: "{{ array | rejectattr('url', 'match', patterns|join('|')) }}"


用于测试的完整剧本示例

- hosts: localhost vars: patterns: - .*amazonaws\.com.* - .*github\.com.* array: - {file: file1.txt, url: bucket.amazonaws.com} - {file: file2.txt, url: github.com} - {file: file3.txt, url: example.com} aws_files: "{{ array | selectattr('url', 'match', patterns.0) }}" github_files: "{{ array | selectattr('url', 'match', patterns.1) }}" result: "{{ array | difference(aws_files + github_files) }}" resul2: "{{ array | rejectattr('url', 'match', patterns|join('|')) }}" tasks: - debug: msg: | aws_files: {{ aws_files }} github_files: {{ github_files }} result: {{ result }} resu2t: {{ resul2 }}

    
© www.soinside.com 2019 - 2024. All rights reserved.