XML文書には次の例があります。
<meta name=Originator content="text/html; charset=iso-8859-6">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 15"/>
次のsedコマンドを実行するとき:
'/./{H;$!d} ; x ; s@<meta\([^/>]*\)>@<meta\1/>@g'
私は次のような結果を得ます。
<meta name=Originator content="text/html; charset=iso-8859-6">
<meta name=ProgId content=Word.Document/>
<meta name=Generator content="Microsoft Word 15"/>
最初の例では、テキストとhtmlの間にスラッシュがあるため、閉じるスラッシュがありません。
ただし、sedコマンドを次のように変更すると:
'/./{H;$!d} ; x ; s@<meta\([^>]*\)>@<meta\1/>@g'
次に、3番目の例には二重スラッシュがあります。
<meta name=Originator content="text/html; charset=iso-8859-6"/>
<meta name=ProgId content=Word.Document/>
<meta name=Generator content="Microsoft Word 15"//>
どちらのケースにも対処する方法についてのアイデアはありますか?
答え1
いつものように、義務的な警告を含める必要があります。 [XH] TMLを解析するために単純なテキスト解析ツールを使用するのは悪い考えです。頻繁に失敗し、入力変更に強力ではなく、文書を破損する作業を自動的に実行する可能性が高いです。あなたはする必要がありますいつも専用のXMLパーサーを試してください。
つまり、次の仮定が成立している場合は、次の解決策を使用できます。
- タグのどれも複数行にまたがっていません。
- すべての
<meta
オープンタグ(およびそのタグのみ)はaで終わる必要があります/>
。 - 内部タグを持つことはできません
>
。私は実際にこれが起こるかどうかを知るのに十分なXML仕様を知りません。おそらくname=
?
上記が本当なら、次のことを試してください。
$ sed -E 's|(<meta [^>]*[^/])>|\1/>|' file.xml
<meta name=Originator content="text/html; charset=iso-8859-6/>
<meta name=ProgId content=Word.Documen/>
<meta name=Generator content="Microsoft Word 15"/>