Unixコマンドを使用してXMLでパターンを検索する

Unixコマンドを使用してXMLでパターンを検索する

以下のXMLがあります。

<a>
</a>
<a>
<b></b>
<c></c>
</a>

以下のように、中間にラベルがない2つの連続した行にある空のラベルの行番号を見つける必要があります。

    <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"

おすすめ記事