仅当上一行有标记时才删除行 - sed ?或者更容易?

仅当上一行有标记时才删除行 - sed ?或者更容易?

我面临着一个相当新手的问题,并且引起了我的注意:(我有一个带有 xml 标签的文件,当我发现:

    </ac:image>
  </a>

后跟</ac:image></a>,然后删除带有 的行</a>

之前还有一个“a href”,但那个相当具体,我用 sed 和一个匹配项将其删除。在这一点上,我想知道如何处理它,如果它是多行匹配,但不确定如何选择匹配的第二行。

有人可以指出我正确的方向吗?

答案1

如果它始终是相同的序列,没有意外,则不需要 XML 解析,并且确实可以使用sed.

要始终检查一对两行,请使用以下N;P;D模式sed

sed 'N;P;\_</ac:image>\n *</a>$_d;D' filename

它是如何工作的?

  • N追加下一行。通常您会$!N检查是否有下一行,但这在您的情况下没有问题:如果没有下一行,则不会发生任何特殊情况。
  • 现在缓冲区中有两行,P打印第一行
  • \_</ac:image>\n *</a>$_d d如果找到给定的两行模式(\n是行之间的换行符),则删除模式空间。第一行已打印,因此删除模式空间只会删除该对的第二行
  • 仅当模式不匹配时才执行最后一条语句。删除D第一行(和换行符)并使用该对的第二行重新开始循环,因此每对行都会被检查

答案2

gsed '/<\/ac:image>/,+1 { /<\/a>$/d; }' testfile.txt

其中gsed代表 GNU sed

相关内容