Sed
如何使用 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"//>
關於如何涵蓋這兩種情況的任何想法?
像往常一樣,我需要包含一個強制性警告:使用幼稚的文本解析工具來解析
$$ 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"/>