bash(sed或awk首选)删除第一个和最后一个实例之间的所有内容

Mar*_*tin 2 regex bash awk sed

我对sed非常熟悉,但我不太了解awk,我不知道如何解决这个问题.我已经google了一段时间但到目前为止没有运气.情况就是这样:我有一个包含组和部分的大文件,如下所示:

<A1>
  some nr of lines
</A1>
<A2>
  some nr
  of lines
</A2>
<B1>
  some
  nr of
  lines
</B1>
<B2>
  some nr of lines
</B2>
<B3>
  bla
</B3>
<C1>
  bla
</C1>
<C2>
  bla
</C2>
Run Code Online (Sandbox Code Playgroud)

现在问题是组的数量可以改变,部分的数量可以改变,并且每个部分中的行数可以改变.例如,A部分可能转到25,B部分可能转到8,依此类推.我需要做的是删除某些组的所有条目,在上面的示例中,我想删除所有内容<B*>,留下以下内容:

<A1>
  some nr of lines
</A1>
<A2>
  some nr
  of lines
</A2>
<C1>
  bla
</C1>
<C2>
  bla
</C2>
Run Code Online (Sandbox Code Playgroud)

另外,我想删除几个部分(尽管这些部分可以在单独的运行中),例如,如果文件从A1转到R123,我想要删除B*,F*,M*等.

如果有类似的事情已经被问到并在某处我回答道歉,我确实在发布之前找到了解决方案.

谢谢!

anu*_*ava 6

使用sed:

sed '/<B1>/,/<\/B3>/d' infile
Run Code Online (Sandbox Code Playgroud)

这意味着从sed的输出中查找一系列文本并从中<B1>结束</B3>并从中删除它.(这意味着sed将在stdout上打印其余文件)

编辑:这也适用于您的情况:

sed '/<B[0-9]*>/,/<\/B[0-9]*>/d' 
Run Code Online (Sandbox Code Playgroud)

  • `sed'/ <B [0-9]*> /,/ <\/B [0-9]*>/d'`做到了!太棒了,谢谢你! (2认同)