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

Regex 将具有版本号的文件重命名为不具有版本号的文件,regex,ansible,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:

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

预期结果应将[a-z\-][\[0-9\.\-].war重命名为[a-z\-][.\-].war

我猜您的表达式很好,我们可能需要添加一些捕获组

([a-z-]*)([0-9.-]*)(\..*)
并用
$1$3
替换


由于演示的原因,我删除了转义,您只需在必要时添加转义即可。

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

([a-z-]*[a-z])([0-9.-]*)(\..*)
并将其替换为:

\1\3
测试一下



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

如果文件名不能包含连续的连字符,并且不能在开头或结尾,则可以使用一个捕获组来保持匹配
[a-z]+
,然后是一个重复模式,以确保连字符不在结尾

然后,通过再次匹配
-
和1+数字,然后重复匹配点和数字,以匹配要删除的内容,这样就不会有连续的点,也不会出现在开始和结束处

最后,使用正向前瞻来断言右边的是
。war

如果文件名本身也可以包含数字和下划线等单词字符,则也可以使用
\w+

在替换中,使用第一个捕获组中要保留的内容
\1

(\w+(?:-\w+)*)-\d+(?:\.\d+)*(?=\.war\b)
解释

  • 捕获组1
    • \w+(?:-\w+*
      匹配1+个单词字符,后跟0+次a
      -
      和1+个单词字符
  • 关闭非捕获组
  • -\d+
    匹配
    -
    和1+位
  • (?:\。\d+*
    重复0+次,匹配a
    和1+个数字
  • (?=\.war\b)
    正向前瞻,断言直接在右边的是
    .war
    ,后面跟一个单词边界,以防止战争成为更大单词的一部分

您必须只使用Ansible吗?