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

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

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

control_center_basic_users:
- 直到文件末尾

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

我已经尝试过以下方法(在有关文件末尾的另一个问题中找到)

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

但这行不通。我还没有找到一种方法可以包含文件后面以及一直到文件末尾的所有内容。
如何编写正则表达式以包含直到文件末尾的所有内容?

我还尝试了

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

kafka_users_test.yaml的格式 - masterkey 值已更改,因此这不是实际值,只是保持该值的相同格式。

secrets_protection_masterkey: XUasdfghjklopiuytrewqazxcvbnmkljhdsetbfsd+E=
sasl_plain_users:

  user1_producer:
    principal: user1_producer
    password: user1-secret
  user2_consumer:
    principal: user2_consumer
    password: user2-secret
  user3_producer:
    principal: user3_producer
    password: user3-producer-secret
  user4_consumer:
    principal: user4_consumer
    password: user4-consumer-secret
  test_newuser:
    principal: test_newuser
    password: newuser
  DATA_25739:
    principal: DATA_25739
    password: DATA_25739_pw
control_center_basic_users:
  admin:
    principal: admin
    password: ''
    roles: admin

另外,我想去掉下面的空行

sasl_plain_users:

  user1_producer:

我尝试过这个,但不起作用

- name: remove empty line from yaml
  lineinfile: 
    dest: /software/confluent-7.3/secrets/kafka_users_test.yaml
    state: absent 
    regexp: '^$'
regex replace ansible
2个回答
1
投票

给出测试文件

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

.
特殊字符匹配任何字符除了换行符...

如果未设置,匹配项将被完全删除

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

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

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

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

注意:由于正则表达式与尾随换行符不匹配,该行并未完全删除。换句话说,换行符被保留。这就是您看到空行的原因。


问:“从文件中删除以特定字符串

control_center_basic_users:
开头的文本,直到文件末尾。”

A:如果您想选择剩余的内容直到文件末尾,请将

.
替换为
[\S\s]
(信用@Nick),以匹配包括换行符在内的任何字符。例如,

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

做你想做的事

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

注意:这些行被完全删除,因为正则表达式也匹配尾随换行符。这就是为什么您看不到任何空行的原因。


用于测试的完整剧本示例

shell> cat pb.yml
- hosts: all

  tasks:

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

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

0
投票

由于您正在处理 YAML 文件,因此您可以这样做的一种方法是

  1. slurp
    它,这样你就可以将文件内容作为YAML结构来管理
  2. 拒绝字典中的属性
    control_center_basic_users
    ,帮助一对
    dict2items
    /
    items2dict
  3. 使用
    to_nice_yaml
    及其
    sort_keys=False
    选项将其转储回文件,否则 YAML 转储器也会按字母顺序重新排序你的字典键 - 这样做也会消除任何白线,正如你也提到的那样

因此,有两个任务:

- slurp:
    src: /tmp/kafka_users_test.yaml
  register: kafka_users

- copy:
    content: >-
      {{
        kafka_users.content
          | b64decode
          | from_yaml
          | dict2items
          | rejectattr('key', '==', 'control_center_basic_users')
          | items2dict
          | to_nice_yaml(sort_keys=False)
      }}
    dest: /tmp/kafka_users_test.yaml

您的文件 /tmp/kafka_users_test.yaml 最终看起来像这样:

secrets_protection_masterkey: XUasdfghjklopiuytrewqazxcvbnmkljhdsetbfsd+E=
sasl_plain_users:
    user1_producer:
        principal: user1_producer
        password: user1-secret
    user2_consumer:
        principal: user2_consumer
        password: user2-secret
    user3_producer:
        principal: user3_producer
        password: user3-producer-secret
    user4_consumer:
        principal: user4_consumer
        password: user4-consumer-secret
    test_newuser:
        principal: test_newuser
        password: newuser
    DATA_25739:
        principal: DATA_25739
        password: DATA_25739_pw
© www.soinside.com 2019 - 2024. All rights reserved.