我想将file-name-1.2.3.war重命名为file-name.war
我尝试了各种Ansible模块来重命名文件,但是,我不知道如何获取文件列表和删除文件名中的版本号。
- name: "List *.war if exists on {{ lookup('env','WORKSPACE') }}"
local_action:
module: find
paths: "{{ lookup('env','WORKSPACE') }}"
patterns:
- "[a-z\\-]*[\\[0-9\\.\\-]*.war"
register: files_matched
- name: "DEBUG: List *.war if exists on {{ lookup('env','WORKSPACE') }}"
debug:
msg:
- "{{ files_matched.files | map(attribute='path') | list }}"
预期结果应将[az \-] [\ [0-9 \。\-] .war重命名为[az \-] [。\-] .war
答案 0 :(得分:1)
答案 1 :(得分:0)
我的猜测是您的表达很好,我们可能想添加一些捕获组,
([a-z-]*)([0-9.-]*)(\..*)
并替换为$1$3
。
Please see the demo for additional explanation.
我出于演示原因删除了转义符,您可以仅在必要时添加它们。
答案 2 :(得分:0)
如果文件名不能包含连续的连字符,并且不能在开头或结尾处包含连字符,则可以使用捕获组来保持匹配[a-z]+
的内容,然后使用重复模式以确保连字符为不是最后。
然后再次匹配-
和1+位数字,然后匹配一个重复的模式以匹配点和数字,以匹配要删除的内容,这样就不能有连续的点,并且不能在开头和结束。
最后,使用积极的前瞻来断言右边的是.war
如果文件名本身也可以包含数字和下划线之类的文字字符,则也可以使用\w+
。
在替换中,使用要保留的内容在第一个捕获组\1
(\w+(?:-\w+)*)-\d+(?:\.\d+)*(?=\.war\b)
说明
(
捕获组1
\w+(?:-\w+)*
匹配1+个单词字符,然后匹配0+次-
和1+单词字符)
关闭非捕获组-\d+
匹配-
和1个以上的数字(?:\.\d+)*
重复0+次以匹配.
和1+个数字(?=\.war\b)
正向前进,断言右边直接是.war
,后面紧跟单词边界,以防止战争成为大单词的一部分