awk:删除特定文本块中的行
awk: delete lines in specific block of text
这次我从我的的接受答案中搜索第二个awk-oneliner的扩展版本,所以请先看看那里,谢谢。
必须扩展此 awk,以便在将文件 inserted.txt 插入其中之前,我可以从同一块编号 (num) 中删除所有包含单词 foobar 的行:
/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS [=10=]:[=10=]; next} /<\/VirtualHost>/ && ++c==num{print ins} 1' inserted.txt vhosts-ssl.conf
前一个awk的输出:
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
foobar 2
barfoo 1
foobar 1
barfoo 2
inserted line 1
inserted line 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
我需要得到的输出:
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
barfoo 1
barfoo 2
inserted line 1
inserted line 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
原始输入数据供参考:
$ cat inserted.txt
inserted line 1
inserted line 2
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
foobar 2
barfoo 1
foobar 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
我试图在打印之前插入各种搜索和替换以及删除片段,但这没有用(愚蠢的我):( 类似的东西:
/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS [=14=]:[=14=]; next} /<\/VirtualHost>/ && ++c==num{!/foobar/ print ins} 1' inserted.txt vhosts-ssl.conf
提前致谢。
你必须稍微修改一下脚本
$ awk -v num=2 'NR==FNR{ins=ins?ins ORS [=10=]:[=10=]; next}
/<VirtualHost/&&++c==num{p=1}
p&&/<\/VirtualHost>/{print ins; p=0}
!p||!/foobar/' insert.file orig.file
这次我从我的
必须扩展此 awk,以便在将文件 inserted.txt 插入其中之前,我可以从同一块编号 (num) 中删除所有包含单词 foobar 的行:
/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS [=10=]:[=10=]; next} /<\/VirtualHost>/ && ++c==num{print ins} 1' inserted.txt vhosts-ssl.conf
前一个awk的输出:
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
foobar 2
barfoo 1
foobar 1
barfoo 2
inserted line 1
inserted line 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
我需要得到的输出:
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
barfoo 1
barfoo 2
inserted line 1
inserted line 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
原始输入数据供参考:
$ cat inserted.txt
inserted line 1
inserted line 2
$ cat vhosts-ssl.conf
<VirtualHost *:443>
vhost 1
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 2
foobar 2
barfoo 1
foobar 1
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 3
foobar 1
barfoo 1
foobar 2
barfoo 2
</VirtualHost>
<VirtualHost *:443>
vhost 4
foobar 1
foobar 2
barfoo 1
barfoo 2
</VirtualHost>
我试图在打印之前插入各种搜索和替换以及删除片段,但这没有用(愚蠢的我):( 类似的东西:
/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS [=14=]:[=14=]; next} /<\/VirtualHost>/ && ++c==num{!/foobar/ print ins} 1' inserted.txt vhosts-ssl.conf
提前致谢。
你必须稍微修改一下脚本
$ awk -v num=2 'NR==FNR{ins=ins?ins ORS [=10=]:[=10=]; next}
/<VirtualHost/&&++c==num{p=1}
p&&/<\/VirtualHost>/{print ins; p=0}
!p||!/foobar/' insert.file orig.file