所有比赛的 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'