regex 如何使用正则表达式将所有出现的单词替换为另一个单词

jm81lzqq  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(203)

我正在尝试使用Regex将Web.config文件中的标记值替换为Ansible Playbook。
这是我的示例文件。

TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Catalog Name=catalogname;User =user;key=key;

我期望的输出应为

TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;
TXWebSocketHandler="Data =127.0.0.1;Catalog Name=catalogname;User =user;key=key;

所有本地主机都应替换为127.0.0.1。
我使用的战术手册是

- name: replace_config
    community.windows.win_lineinfile:
      path: 'D:\Apps\project\web.config'
      regexp: /localhost/g
      line: 127.0.0.1

为此,我将得到如下输出:

TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
TXWebSocketHandler="Data =localhost;Socket Name=Socketname;User =user;key=key;
127.0.0.1

我添加的替换值在localhost中没有被替换,但它被添加到文件的末尾。当我尝试使用任何regex generator时,它都能像我希望的那样正常工作。
这是正则表达式的问题还是我在这个ansible剧本中遗漏了任何参数?请建议一些方法来用另一个单词替换所有出现的单词。

xytpbqjk

xytpbqjk1#

单行限制

模块 community.windows.win_lineinfile 似乎只能在单行上工作:
确保特定行位于文件中,或使用反向引用的正则表达式替换现有行
摘自概要:
当您只想更改文件中的一行时,这一点非常有用。
你仍然可以使用backrefs: true来替换一行,参见文档(限制用粗体强调):
如果regexp匹配,则最后一个匹配行将被扩展行参数替换。
另请参见Ansible lineinfile module syntax error when using multiple variables in string
在您的行动手册中:

- name: replace_config
    community.windows.win_lineinfile:
      path: 'D:\Apps\project\web.config'
      backrefs: true
      regexp: '^(.*)localhost(.*)$'
      line: '$1 127.0.0.1 $2'

这应该会将匹配的localhost替换为回送IP 127.0.0.1,并将之前(由$1反向引用)和之后(由$2反向引用)捕获的部分设置回。
注:如果有效,请尝试删除IP地址周围的空格。

替换为内置模块

正如塞沙德里克所建议的:ansible.builtin.replace模块可用于:
使用反向引用正则表达式替换文件中特定字符串的所有示例
参见概要:
此模块将替换文件中图案的所有示例。
从文档中,根据您的用例修改第一个示例“用新主机名替换旧主机名”:

- name: Replace old hostname with new hostname (requires Ansible >= 2.4)
  ansible.builtin.replace:
    path: D:/Apps/project/web.config
    regexp: '(.*)localhost(.*)$'
    replace: '\1 127.0.0.1 \2'

注意:我将反斜杠(Windows路径分隔符)替换为正斜杠(Python中更安全)。在back-ref \1之后和\2之前添加的空格可能会被删除(不确定是否有效,因为back-ref和IP-address的编号可能会冲突)。另一种方法请参见文档“Explicitly specified named matched groups”中的另一个示例。

相关问题