【问题标题】:Replace last occurrence of .jar in ansible regex_replace替换 ansible regex_replace 中最后一次出现的 .jar
【发布时间】:2020-07-04 02:17:11
【问题描述】:

如何仅替换 .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"

【问题讨论】:

  • 如果答案之一回答了您的问题,请不要忘记接受(并投票)。
  • 当然。会做的

标签: regex ansible


【解决方案1】:

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


拆分文本

使用splitext。例如

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

gives(假设文件名列表在变量 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'

拆分

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

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

regex_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 }}"

为了使代码更具可读性,最好将正则表达式放入变量中并使用single-quoted style。例如

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

【讨论】:

  • 嗨,我可以知道我是否输入了 regex_replace('.jar$') 是否有 imapct?当我测试时,这也相应地显示出来。
  • 对您的具体情况没有影响,因为所有文件名都以扩展名“.jar”结尾。正则表达式中的点匹配任何字符并匹配点“。”在文件名的扩展名中也是如此。因此,正则表达式匹配所有文件的扩展名。您将看到文件名的差异,例如“my-firsrt.jar-1-jar”。扩展名“-jar”也将匹配。如果你想匹配一个点“。”转义它“\。”或在正则表达式中明确地将其作为字符“[.]”。这将准确地声明您想要的内容,并避免以后阅读代码时产生混淆。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 嗨,我可以知道如果我把 regex_replace('.jar$') 有没有 imapct?当我测试时,这也相应地显示出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多