我有像下面这样的 XML
<a>
</a>
<a>
<b></b>
<c></c>
</a>
我需要找到空标签的行号,这些标签位于连续的两行中,中间没有任何标签,如下所示。
<a>
</a>
Output: 1 -> line number
我正在使用 PCGREP,但我的 Unix 管理员限制或不支持 perl 命令,因此可以使用 SED 或 AWK 来实现吗?注意:也不支持 xmlstarlet。
答案1
Sed解决方案
#!/bin/bash
sed -nr '
/^<[^<]*>$/ {
N
/^<([^<]*)>\n<\/\1>$/=
}
' "$1" | awk '{print "Output: "$NF - 1" -> line number"}'
解释:
sed
/^<[^<]*>$/
如果我们一行中有一个开放标签N
- 将下一行输入附加到模式空间中。/^<([^<]*)>\n<\/\1>$/
并检查下一行是否具有等效的闭合标记。- 如果是这样,则通过命令打印该行号
=
。请记住,它是封闭标记行号。我们应该进一步将其减少一。
awk
- 减少行号并将其打印在消息字符串中。
测试:
输入
<a>
</a>
<a>
<b></b>
<c></c>
<c>
</c>
</a>
输出
./empty_tag.sh input.txt
Output: 1 -> line number
Output: 6 -> line number
AWK解决方案
用法: ./empty_tag.sh input.txt
#!/bin/bash
awk -F'[>/]' '
line_num {
if(NF == 3) {print "Output: " line_num " -> line number";}
line_num = 0;
}
NF == 2 {line_num = NR;}
' "$1"