Sed

如何使用 sed 添加關閉 XML 標記

  • September 8, 2021

我在 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 解析器。 也就是說,如果以下假設成立,您可以使用以下解決方案:

  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"/>

引用自:https://unix.stackexchange.com/questions/668173