我面临着一个相当新手的问题,并且引起了我的注意:(我有一个带有 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
。