我试图在文本文件中每次出现特定字符串后插入一行。我尝试使用lineinfile
ansible 模块,但它只能在文件中匹配字符串的最后一个或第一个实例之后插入一行。有谁知道如何使用 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