所有比赛的 lineinfile
lineinfile on all matches
由于 lineinfile
只检查第一个或最后一个匹配项,有没有一种方法可以让我使用它来根据需要在所有匹配项上编辑我的文件?
示例:我有一个类似下面的文件,我想在所有 AAA
匹配后添加 ZZZ
。
源文件:
AAA
BBB
AAA
CCC
DDD
期望的输出:
AAA
ZZZ
BBB
AAA
ZZZ
CCC
DDD
我尝试了模块 replace
,但由于它必须匹配正则表达式,所以我也不知道如何编写它。
写下你的任务:
tasks:
- name: replace
replace:
path: ./pathoffile
regexp: '^(AAA)$'
replace: '\nZZZ'
或者如果您不想使用组正则表达式
regexp: '^AAA$'
replace: 'AAA\nZZZ'
如果您只想更改 AAA
而不是 \nZZZ
,请使用 regex: '^(AAA)$(?!\nZZZ)'
下面的解决方案有效,但不是幂等的。反向引用 '\nZZZ'
没有区别
- replace:
path: test.txt
regexp: '^AAA$'
replace: 'AAA\nZZZ'
运行check和diff模式的播放--check --diff
可以看到换行符\nZZZ
会重复添加
TASK [replace] ********************************************
--- before: test.txt
+++ after: test.txt
@@ -1,7 +1,9 @@
AAA
+ZZZ
ZZZ
BBB
AAA
ZZZ
+ZZZ
CCC
DDD
使用Python正则表达式负先行断言(?!...)
使任务幂等。下面的 regexp 只有在 AAA\n
后面没有跟 ZZZ
时才会匹配
- replace:
path: test.txt
regexp: 'AAA\n(?!ZZZ)'
replace: 'AAA\nZZZ\n'
由于 lineinfile
只检查第一个或最后一个匹配项,有没有一种方法可以让我使用它来根据需要在所有匹配项上编辑我的文件?
示例:我有一个类似下面的文件,我想在所有 AAA
匹配后添加 ZZZ
。
源文件:
AAA
BBB
AAA
CCC
DDD
期望的输出:
AAA
ZZZ
BBB
AAA
ZZZ
CCC
DDD
我尝试了模块 replace
,但由于它必须匹配正则表达式,所以我也不知道如何编写它。
写下你的任务:
tasks:
- name: replace
replace:
path: ./pathoffile
regexp: '^(AAA)$'
replace: '\nZZZ'
或者如果您不想使用组正则表达式
regexp: '^AAA$'
replace: 'AAA\nZZZ'
如果您只想更改 AAA
而不是 \nZZZ
regex: '^(AAA)$(?!\nZZZ)'
下面的解决方案有效,但不是幂等的。反向引用 '\nZZZ'
没有区别
- replace:
path: test.txt
regexp: '^AAA$'
replace: 'AAA\nZZZ'
运行check和diff模式的播放--check --diff
可以看到换行符\nZZZ
会重复添加
TASK [replace] ********************************************
--- before: test.txt
+++ after: test.txt
@@ -1,7 +1,9 @@
AAA
+ZZZ
ZZZ
BBB
AAA
ZZZ
+ZZZ
CCC
DDD
使用Python正则表达式负先行断言(?!...)
使任务幂等。下面的 regexp 只有在 AAA\n
后面没有跟 ZZZ
- replace:
path: test.txt
regexp: 'AAA\n(?!ZZZ)'
replace: 'AAA\nZZZ\n'