sedを使用して閉じるXMLタグを追加する方法

sedを使用して閉じるXMLタグを追加する方法

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パーサーを試してください。

つまり、次の仮定が成立している場合は、次の解決策を使用できます。

  1. タグのどれも複数行にまたがっていません。
  2. すべての<metaオープンタグ(およびそのタグのみ)はaで終わる必要があります/>
  3. 内部タグを持つことはできません>。私は実際にこれが起こるかどうかを知るのに十分な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"/>

おすすめ記事