Ansible 正则表达式替换匹配但排除同一行中的其他匹配

问题描述 投票:0回答:1

配置文件中的以下行要替换为java路径,但不要替换有java.base和java.lang的java。

  1. JAVA_VERSION=$("java" -version 2>&1 | awk -F '"' '/version/ {print $2}')

  2. $java -DagentVersion=2.6.0 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar

在 ansible 任务中尝试过以下

- replace:
  path: "/tmp/config.txt"
  regexp: '^(?!.*java[.])(?=java)(.*)$'
  replace: '/opt/java17\1'

预期输出:将两行中的 java 替换为 /opt/java17,但不编辑和排除同一行区域 (java.base/java.lang) 中匹配的 java。

  1. JAVA_VERSION=$("/opt/java17" -版本 2>&1 | awk -F '"' '/版本/ {打印$2}')

  2. $/opt/java17 -DagentVersion=2.6.0 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar

regex ansible
1个回答
0
投票

尝试:

\bjava\b(?!\.)

参见:regex101


说明

  • \b
    :匹配单词边界
  • java
    :匹配文字“java”
  • \b
    :匹配单词边界
  • (?!\.)
    :检查“java”后面是否跟着文字“.”

您的

(?=java)
构造找到“java”,但是您的
(?!.*java)
构造也匹配“java”,因此在您想要匹配的位置失败,因为“.*”可以匹配 0 个字符。

© www.soinside.com 2019 - 2024. All rights reserved.