2

如何仅替换 .jar 的最后一个字符。下面是样本值LIST_jar[0].nameOfJar和预期的样本输出

my-firsrt.jar-1.jar           >> my-firsrt.jar-1
my-firsrt-2.0.jar-1.jar       >> my-firsrt-2.0.jar-1
my-firsrt-1.0-jar-1.jar       >> my-firsrt-1.0-jar-1
my-firsrt-jar-1.0-jar-1.jar   >> my-firsrt-jar-1.0-jar-1
my-firsrt-jar-1.0.jar.jar     >> my-firsrt-jar-1.0.jar
my-firsrt-jar-1.0-jar.jar     >> my-firsrt-jar-1.0.jar

这是我的示例代码,但它没有相应地工作,因为它正在替换所有 jar 值。

- name: Replace string
  copy:
    content: "{ name: jack }"
    dest: "{{ directory }}/JAR_LIST/{{ LIST_jar[0].nameOfJar | regex_replace('.jar') }}.log"
4

2 回答 2

1

还有更多选择。最简单的是splitext。更通用的是拆分来操作多个扩展。过滤器regex_replace更复杂但通用。


拆分文本

使用splitext。例如

    - debug:
        msg: "dest: {{ (item|splitext).0 }}.log"
      loop: "{{ list_jar }}"

给出(鉴于文件名列表在变量list_jar 中

  msg: 'dest: my-firsrt.jar-1.log'
  msg: 'dest: my-firsrt-2.0.jar-1.log'
  msg: 'dest: my-firsrt-1.0-jar-1.log'
  msg: 'dest: my-firsrt-jar-1.0-jar-1.log'
  msg: 'dest: my-firsrt-jar-1.0.jar.log'
  msg: 'dest: my-firsrt-jar-1.0-jar.log'

分裂

下一个选项是split。下面的任务给出了相同的结果

    - debug:
        msg: "dest: {{ item.split('.')[:-1]|join() }}.log"
      loop: "{{ list_jar }}"

正则表达式_replace

如果您想使用regex_replace,下面的任务会给出相同的结果。删除扩展名并连接.log

    - debug:
        msg: "dest: {{ item|regex_replace('^(.*)\\.jar$', '\\1') }}.log"
      loop: "{{ list_jar }}"

, 或替换过滤器中的扩展名

    - debug:
        msg: "dest: {{ item|regex_replace('^(.*)\\.jar$', '\\1.log') }}"
      loop: "{{ list_jar }}"

为了使代码更具可读性,最好将正则表达式放入变量中并使用单引号样式。例如

    - debug:
        msg: "dest: {{ item|regex_replace(my_regex, my_replace) }}"
      loop: "{{ list_jar }}"
      vars:
        my_regex: '^(.*)\.jar$'
        my_replace: '\1.log'
于 2020-07-04T03:47:12.943 回答
0

下面是我的示例代码,但它没有相应地工作,因为它正在替换所有 jar 值。

正确,因为.in 正则表达式的意思是“任何字符”。如果您只想替换文字字符串.jar,则不要使用正则表达式替换,只需使用replace()它将使用您提供给它的文字字符。

否则,如果您希望继续使用 regex_replace,则引用该字符并指定模式应该只匹配字符串的结尾

- debug:
    msg: "{{ nameOfJar | regex_replace('[.]jar$', '') }}.log"
  vars:
    nameOfJar: my-firsrt-jar-1.0-jar-1.jar

我们将假设您的最后两个示例只是在此问题中复制粘贴,并且您更喜欢.log胡须外部,而不是仅包括'.log'在 regex_replace 的替换位置

于 2020-07-04T03:38:21.813 回答