在HTML中替换不匹配的左尖括号

时间:2016-12-09 00:34:08

标签: bash awk sed

我的问题:如何查找具有不匹配的左尖括号的行,并将这些括号替换为其HTML等效项。

示例输入:

<dd>
     Pro 10g Flüssigkeit: 2g Wasserstoffperoxid <10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>

通过替换不匹配的&lt;&lt; 10%&#39>来预期输出字符串:

<dd>
     Pro 10g Flüssigkeit: 2g Wasserstoffperoxid &lt;10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>

有德国&#39; Umlaute&#39;包含在我的示例文本中以防万一他们可以搞砸了某些内容&#39; ...

如果可能,我想使用sed或awk。

我看过: Use sed with regex and (How to decrement (substract) number in file with sedsed - regex square brackets detection in Linux和其他Q&amp; A但我似乎无法理解正则表达式。遗憾!

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

这是一个危险的提案,因为sed逐行工作,对于每一行,有几种情况需要考虑:

可能只有没有任何html标签的小于字符:

<p>
    x < 10
</p>

在你的例子中,可能有一个html标签,在小于号的字符

之后
<p> x < 10 </p>

小于字符可以在html标记内。

<img src="..." alt="Graph for x < 10">

它可能是一个非常长的html标签,在后面的行中关闭。

<img
    src="..."
    alt="..."
>

我要做的是首先假设只有前两个选项存在,然后使用这样的东西:

sed -i.orig -r 's/<([^>]*($|<))/\&lt;\1/g' file.

这将使用新扩展程序.orig保留原始文件的备份,以便您可以在两者上运行diff程序以查看更改的内容。

至于如何运作:

  • s/AAA/BBB/g将所有AAA替换为BBB
  • s/A(CC)/B\1/gACC替换为BCC,即为\1
  • 插入括号中的部分
  • [^>]*表示 <{strong> >以外的任何字符中的零个或多个
  • ($|<)可以是行尾或<,以先到者为准。

因此它会在<之前搜索>,直到下一个<或该行的结尾,并用&lt;替换该部分及其所有内容在初始<

之后找到

答案 1 :(得分:1)

这可能足够好了:

$ sed -E 's/<([^>]+<)/\&lt;\1/g' file
<dd>
     Pro 10g Flüssigkeit: 2g Wasserstoffperoxid &lt;10% Tenside. ENTHÄLT: Sulfamidsäure,</dd>

如果没有,那么编辑你的问题提供一个更完整(但仍然简洁和可测试)的例子,真正代表你真实的输入。

关于变音符号或任何其他输入字符btw没什么特别的。