使用 unix 命令在 XML 中查找模式

使用 unix 命令在 XML 中查找模式

我有像下面这样的 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"}'

解释:

  1. sed
    • /^<[^<]*>$/如果我们一行中有一个开放标签
    • N- 将下一行输入附加到模式空间中。
    • /^<([^<]*)>\n<\/\1>$/并检查下一行是否具有等效的闭合标记。
    • 如果是这样,则通过命令打印该行号=。请记住,它是封闭标记行号。我们应该进一步将其减少一。
  2. 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"

相关内容