
テキストファイルから特定の文字列が出るたびに行を挿入しようとしています。 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