我有一个字典列表,例如:
[
{
"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(所以我不必总是将
.*
添加到模式的开头/结尾)。
例如,给定列表中的模式
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 和 github 文件
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 }}