如何使用 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'

然后我在第三个例子上有双斜杠:

<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. 你永远不能有一个>inside 标签。我实际上不太了解 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"/>

相关内容