簡體   English   中英

在正則表達式中使用正則表達式替換單詞

[英]using regexp in ansible to replace word

我實際上是ansible的新手。有人可以幫我使用帶有原始系統ip的regexp更改文件中的ip地址。 假設我想將“ Djgroups.bind_address = <* / WHATEVER / BLANK>”替換為“ Djgroups.bind_address = 10.0.0.45”

這將是一個tomcat實例。 需要更換的生產線:

JAVA_OPTS="-Xms6144m -Xmx6144m -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djgroups.bind_address="

我寫了如下:

  - name: Verifying Instance IP Address
    shell: grep Djgroups.bind_address /apache-tomcat-8.5.15_1/bin/catalina.sh|grep -v ^#|tr -s '=' '"'|cut -d '"' -f5
    register: tomcat_instance_ip
  - debug: msg='Tomcat instance has {{ tomcat_instance_ip.stdout }} set.'

  - name: Updating Tomcat Instance with valid local IP address
    replace:
      dest: /apache-tomcat-8.5.15_1/bin/catalina.sh
      regexp: '^(Djgroups.bind_address(?!.*\b{{ tomcat_instance_ip.stdout }}\b).*)$'
      replace: '\1 {{ ip_address }}'
    when: tomcat_instance_ip.stdout != ip_address

謝謝山姆

我看到正則表達式至少有四個問題:

  1. 你的. 不會轉義,因此將其解釋為特殊字符。
  2. 為什么將^放在開頭。 似乎您正在嘗試在字符串的中間而不是在開頭查找內容。
  3. 您應該在負查找中對。*使用惰性評估。 現在,它將匹配任何東西。
  4. 您正在嘗試匹配字符串的Djgroups.bind_address部分,而我相信您的意思是匹配之后出現的所有內容。

嘗試: Djgroups\\.bind_address=(?!.*?{{ tomcat_instance_ip.stdout }}.*?)(.*)$

並且請先測試您的正則表達式。 https://regex101.com/確保它確實與您想像的輸入相匹配。

刪除shell任務,這不是必需的。

嘗試這個 :

- name: Updating Tomcat Instance with valid local IP address
  replace:
    path: /apache-tomcat-8.5.15_1/bin/catalina.sh
    regexp: 'JAVA_OPTS="(.* )?-Djgroups.bind_address=[^ "]*(.*)"'
    replace: 'JAVA_OPTS="\1-Djgroups.bind_address={{ ip_address }}\2"'

由於replace模塊是冪等的when因此也不需要when

編輯:有關此示例中使用的正則表達式的一些說明

'JAVA_OPTS="(.* )?-Djgroups.bind_address=[^ "]*(.*)"'
            ^___^                              ^__^
 ^_________^ (1) ^______________________^       (2)
      (3)                     (4)
                                         ^__^
                                          (5)
  • 12是“未知”部分。 這可以是任何東西,我們不想在應用替換項時丟失它。 因此,我們用括號將它們捕獲。 我們可以通過用\\1\\2引用它們來替換它們。
  • 34是“已知”部分。 它們用於標識要修改的行。 因為我們實際上知道它們的內容,所以我們實際上並不需要捕獲它們。
  • 5是有趣的部分,這是我們要替換為新內容的部分。 我們不在乎其實際內容。

首先,使用這種怪異的語法, 正則表達式有些令人生畏。 這並不像看起來那樣復雜。 您可以找到很多教程來幫助您理解它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM