【问题标题】:awk: delete lines in specific block of textawk:删除特定文本块中的行
【发布时间】:2017-03-01 12:52:52
【问题描述】:

这次我从question 40066030 接受的答案中搜索第二个 awk-oneliner 的扩展版本,所以请先看看那里,谢谢。

这个 awk 必须被扩展,所以我可以在插入文件 Inserted.txt 之前从相同的块号 (num) 中删除所有包含单词 foobar 的行:

/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS $0:$0; 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>

我试图在打印之前插入各种 seach&replace 和删除 sn-ps,但这不起作用(愚蠢的我):( 类似的东西:

/usr/bin/awk -v num=2 'NR==FNR{ins=ins?ins ORS $0:$0; next} /<\/VirtualHost>/ && ++c==num{!/foobar/ print ins} 1' inserted.txt vhosts-ssl.conf

提前致谢。

【问题讨论】:

    标签: shell unix awk freebsd


    【解决方案1】:

    你必须稍微修改一下脚本

    $ awk -v num=2     'NR==FNR{ins=ins?ins ORS $0:$0; next} 
       /<VirtualHost/&&++c==num{p=1} 
           p&&/<\/VirtualHost>/{print ins; p=0} 
                  !p||!/foobar/' insert.file orig.file
    

    【讨论】:

    • 完美运行。再次感谢。我要买一本关于 awk 的书,非常棒的工具。
    猜你喜欢
    • 2018-08-25
    • 2022-10-14
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多