多くの構成データを含む「XML に似た」ファイルがあります。"]]>]]> で区切られた 3 つの XML ファイルを連結したようなものなので、「XML に似ている」と言います。
例えば
<?xml version="1.0" encoding="UTF-8"?>
<hello><world>"Earth"</world></hello>]]>]]><?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Ring-tailed"</type></lemur></data>]]>]]><?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Mouse"</type></lemur></data>]]>]]>
ファイル内のすべての XML タグをインデントするために xmllint を呼び出すスクリプトを作成しようとしています。ただし、xmllint (および他の多くの xml 書式設定プログラム) では、ファイル内に XML ドキュメントが 1 つだけ存在する必要があるようです。たとえば、ファイルは " " で始まり、<?xml version="1.0" encoding="UTF-8"?>
ルート ツリーが 1 つだけ含まれている必要があります。
そこで、データを個別のチャンクに解析して xmllint に渡す awk スクリプトを作成しようとしましたが、通過できないというエラーが発生しています。スクリプトと出力を以下に示します。
$ awk '
BEGIN {
RS = "]]>]]>"
xmlFormatCommand = "xmllint --format -"
}
{
print $0 | xmlFormatCommand
}
' SmallTest.xml
-:3: parser error : XML declaration allowed only at the start of the document
<?xml version="1.0" encoding="UTF-8"?>
^
-:4: parser error : Extra content at the end of the document
<data><lemur><type>"Ring-tailed"</type></lemur></data>
^
awk が 3 つの一時ファイルに出力する操作と、それらのファイルに対して xmllint を操作する操作の 2 つの操作で実行すると、うまくいきます。
例えば
awk 'BEGIN {RS = "]]>]]>"} {print $0 > "Section_" NR ".txt" }' SmallTest.xml
その結果、Section_1.txt、Section_2.txt、および Section_3.txt の 3 つのファイルが作成されます。Section_2.txt の内容は次のとおりです。
$ cat Section_2.txt
<?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Ring-tailed"</type></lemur></data>
そのファイルを xmllint でフォーマットできます。
$ cat Section_2.txt | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<data>
<lemur>
<type>"Ring-tailed"</type>
</lemur>
</data>
したがって、awkスクリプトの最初の場所でxmllintにパイプできない理由がわかりません。
あなたが提供できる助けに感謝します。
-ジョン