以下の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"}'
説明する:
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"