我需要从文件中删除以特定字符串开头的文本 -
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: '^$'
给出测试文件
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
由于您正在处理 YAML 文件,因此您可以这样做的一种方法是
slurp
它,这样你就可以将文件内容作为YAML结构来管理control_center_basic_users
,帮助一对dict2items
/items2dict
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