将具有版本号的文件重命名为没有版本号的文件

时间:2019-06-26 00:26:32

标签: regex ansible

我想将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

3 个答案:

答案 0 :(得分:1)

如果您不想在文件名的末尾添加-,请使用以下命令:

([a-z-]*[a-z])([0-9.-]*)(\..*)

并替换为:

\1\3

测试here


(这是@Emma提供的答案的改进版本)

答案 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,后面紧跟单词边界,以防止战争成为大单词的一部分

Regex demo