ansibleまたはunixコマンドを使用して、ファイル内の特定のパターンが一致するたびに行を挿入します。

ansibleまたはunixコマンドを使用して、ファイル内の特定のパターンが一致するたびに行を挿入します。

テキストファイルから特定の文字列が出るたびに行を挿入しようとしています。 ansibleモジュールを試しましたが、lineinfileファイル内の一致する文字列の最後または最初のインスタンスの後にのみ行を挿入します。シェルスクリプトやAnsible Playbookを使ってこれを達成する方法を知っている人はいますか?私はLinux OSを使用しているので、この問題を解決するために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

Aベースのソリューションは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

関連情報