Ansible - 替换模块以删除以字符串开头到文件末尾的所有内容

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

我需要从文件中删除以特定字符串开头的文本 -

control_center_basic_users:
- 直到文件末尾

control_center_basic_users:
  admin:
    principal: admin
    password: ''
    roles: admin

我已经尝试过以下方法(在 EOF 的 SO 问题上找到)

- name: cleanup the file 
  ansible.builtin.replace:
    path: /tmp/kafka_users_test.yaml
    regexp: '^(\s*)control_center_basic_users:[^[]+'
    replace: ''
    backup: yes

但这行不通。我还没有找到一种方法可以包含 EOF 之后的所有内容。如何设置正则表达式以包含文件末尾之前的所有内容?

我还尝试了

(.*?)((control_center_basic_users:)|$)
,它标识了
control_center_basic_users:
和最后一行,但不是完整的块。我怎样才能做到这一点?

regex replace ansible
1个回答
0
投票

给出测试文件

shell> cat /tmp/test.yaml
var1: foo
var2: bar
control_center_basic_users:
  - user1
  - user2

参数regexp表示:

.
特殊字符匹配除换行符之外的任何字符...

这意味着下面的正则表达式仅匹配单行

    - replace:
        path: /tmp/test.yaml
        regexp: '^\s*control_center_basic_users:.*$'
        replace: ''

给出(使用选项运行--check --diff)

--- before: /tmp/test.yaml
+++ after: /tmp/test.yaml
@@ -1,5 +1,5 @@
 var1: foo
 var2: bar
-control_center_basic_users:
+
   - user1
   - user2

如果您想选择其余字符直到文件末尾,请使用与任何字符匹配的

[\S\s]
(信用@Nick)。例如,

    - replace:
        path: /tmp/test.yaml
        regexp: '^\s*control_center_basic_users:[\S\s]*$'
        replace: ''

做你想做的事

--- before: /tmp/test.yaml
+++ after: /tmp/test.yaml
@@ -1,5 +1,2 @@
 var1: foo
 var2: bar
-control_center_basic_users:
-  - user1
-  - user2
© www.soinside.com 2019 - 2024. All rights reserved.