使用AWK,如何删除包含特定模式的节

时间:2016-03-16 13:24:40

标签: awk gawk

我是AWK的新手,但我需要从一个似乎不是很简单的规则开始,至少对我而言。也许有人可以帮我找到解决方案。

我需要搜索并删除一些包含特定模式的行。至于bekow示例:我需要删除包含名称" pippo2"

的整个部分(三行)

输入文件:

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo2
   </Name>
   <Name>
      Pippo3
   </Name>

所需的输出文件:

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo3
   </Name>

一切顺利 莫罗

您好!
谢谢大家的建议。

但我很抱歉确认您的意见,实际上使用的结构有点复杂,建议的过滤器停止工作: - (

这是更复杂的结构:

  <Name>
     <data>Pippo1</data>
  </Name>
  <Name>
     <data>Pippo2</data>
  </Name>
  <LastName>
     <data>Pippo3</data>
  </LastName>

2 个答案:

答案 0 :(得分:1)

gawk救援!

你需要一个正则表达式RS来表示以下内容(gawk支持)

 awk -v RS="</[^>]+>" '!/Pippo2/{printf "%s", $0 RT}' pippos

   <Name>
      Pippo1
   </Name>
   <Name>
      Pippo3
   </Name>

答案 1 :(得分:0)

如果文件t.dat包含您的数据,则以下awk脚本将执行此任务:

$ awk '/<Name>/{notFound=1} {str=str $0} /Pippo2/{notFound=0} /<\/Name>/{if(notFound){print str;} str=""; notFound=1;}' t.dat
<Name>Pippo1</Name>
<Name>Pippo3</Name>

当然这个解决方案不是很通用 - 它只适用于像你这样的架构的数据文件 - 每个记录(可能是多行)都附有<Name> ... </Name>标签。