以自然字母数字顺序排列ansible中的列表
Sorting list in ansible in natural alphanumeric order
有没有办法以自然方式对 Ansible / Jinja 中的列表进行排序?
例如这是列表
test
test123
test12
test5
test1234test
test22te
而且我需要它来考虑整体而不是个别的数字,所以 test12 在 test5 下,依此类推...
创建一个列表,其属性 index 为整数类型,例如
- set_fact:
l2: "{{ l2|default([]) +
[{'index': (_index|length > 0)|ternary(_index|int, 0),
'name': item}] }}"
loop: "{{ l1 }}"
vars:
_regex: '^test(\d*)\D*$'
_replace: ''
_index: "{{ item|regex_replace(_regex, _replace) }}"
- debug:
msg: "{{ l2|sort(attribute='index')|
map(attribute='name')|
list }}"
给予
msg:
- test
- test5
- test12
- test22te
- test123
- test1234test
最后制作了符合我需要的 jinja 过滤器“natsort_filter.py”。如果你喜欢,可以在这里获取:
https://gitlab.privatecloud.sk/vladoportos/custom-jinja-filters
它确实需要 python 的 natsort 模块,但它工作得很好:)
有没有办法以自然方式对 Ansible / Jinja 中的列表进行排序?
例如这是列表
test
test123
test12
test5
test1234test
test22te
而且我需要它来考虑整体而不是个别的数字,所以 test12 在 test5 下,依此类推...
创建一个列表,其属性 index 为整数类型,例如
- set_fact:
l2: "{{ l2|default([]) +
[{'index': (_index|length > 0)|ternary(_index|int, 0),
'name': item}] }}"
loop: "{{ l1 }}"
vars:
_regex: '^test(\d*)\D*$'
_replace: ''
_index: "{{ item|regex_replace(_regex, _replace) }}"
- debug:
msg: "{{ l2|sort(attribute='index')|
map(attribute='name')|
list }}"
给予
msg:
- test
- test5
- test12
- test22te
- test123
- test1234test
最后制作了符合我需要的 jinja 过滤器“natsort_filter.py”。如果你喜欢,可以在这里获取:
https://gitlab.privatecloud.sk/vladoportos/custom-jinja-filters
它确实需要 python 的 natsort 模块,但它工作得很好:)