使用 ansible 或 unix 命令在文件中特定模式的每次匹配后插入行

使用 ansible 或 unix 命令在文件中特定模式的每次匹配后插入行

我试图在文本文件中每次出现特定字符串后插入一行。我尝试使用lineinfileansible 模块,但它只能在文件中匹配字符串的最后一个或第一个实例之后插入一行。有谁知道如何使用 shell 脚本或 ansible 剧本来实现这一点。我使用的是 Linux 操作系统,因此任何解决此问题的 UNIX 命令都会有所帮助。

如下所示,我尝试mba在以 开头的每一行之后插入foo

原txt文件内容:

foo
ab
zz
foo='dummy'
cd
zz
foo='dats'
lm
xx

所需输出:

foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

答案1

基于 - 的解决方案awk可能如下所示:

awk '{print} /^foo/{print "mba"}' input.txt

默认情况下,这将打印当前行,但如果它恰好以 开头foo,它也会mba在处理继续到下一行之前打印附加行。

答案2

问:在以文本“foo”开头的每一行之后插入“mba”。

答:使用代替在 Ansible 中,例如给定文件

shell> cat foo.txt
foo
ab
zz
foo='dummy'
cd
zz
foo='dats'
lm
xx

任务

    - replace:
        path: foo.txt
        regexp: '^foo(.*)$'
        replace: |-
          foo\1
          mba

给出

shell> cat foo.txt
foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

下面的任务给出相同的结果并且是幂等的

    - replace:
        path: foo.txt
        regexp: 'foo(.*)\n(?!mba)(.*)'
        replace: |-
          foo\1
          mba
          \2

答案3

有几个选择:

  • perl

    $ perl -pe 's/^foo.*/$&\nmg/' file
    foo
    mg
    ab
    zz
    foo='dummy'
    mg
    cd
    zz
    foo='dats'
    mg
    lm
    xx
    
  • awk

    $ awk '1;/^foo/{print "mg" }' file
    foo
    mg
    ab
    zz
    foo='dummy'
    mg
    cd
    zz
    foo='dats'
    mg
    lm
    xx
    

答案4

awk

awk '/foo/ {$0 = $0"\nmba"}1' $file

sed

sed 's/foo.*/&\nmba/' $file
foo
mba
ab
zz
foo='dummy'
mba
cd
zz
foo='dats'
mba
lm
xx

相关内容