我在 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 解析器。
也就是说,如果以下假设成立,您可以使用以下解决方案:
- 您的标签都不会跨越多行。
- 所有
<meta
开始标签(并且只有那些标签)需要 a/>
来结束。 - 你永远不能有一个
>
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"/>