【问题标题】:Substitute unmatched left angle brackets in HTML替换 HTML 中不匹配的左尖括号
【发布时间】:2016-12-09 00:34:08
【问题描述】:

我的问题:如何找到带有不匹配的左尖括号的行并将这些括号替换为它们的 HTML 等效项。

示例输入:

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

替换不匹配的'

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

我的示例文本中包含德语“元音变音”,以防他们“搞砸”...

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

我已阅读: Use sed with regex and (How to decrement (substract) number in file with sedsed - regex square brackets detection in Linux 和其他问答,但我似乎无法理解正则表达式。对不起!

非常感谢您的帮助!

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    这是一个危险的提议,因为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 插入括号中的部分
    • [^&gt;]* 表示零个或多个以外的任何字符 &gt;
    • ($|&lt;) 是行尾或&amp;lt;,以先到者为准。

    所以它会搜索没有&gt;&amp;lt;,直到下一个&amp;lt; 或行尾,然后用&amp;lt; 替换该部分以及在初始&amp;lt; 之后找到的所有内容

    【讨论】:

      【解决方案2】:

      这可能已经足够了:

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

      如果没有,请编辑您的问题,提供一个更完整(但仍然简洁且可测试)的示例,该示例真正代表您的真实输入。

      顺便说一句,变音符号或任何其他输入字符没有什么特别之处。

      【讨论】:

      • 关于变音符号:我正在解析 vCard(即纯 ASCII 文件)时,姓氏中看起来完全正常的 'ü' 终止了我的 awk 脚本。我从来没有发现为什么成千上万的这些 vCard(许多包含变音符号和“ß”,并且都来自同一来源)被解析没有任何问题,但这个没有任何问题。因此...
      • 如果任何字符终止(或对您的 awk 脚本产生任何其他不利影响),那么您的 awk 脚本中就存在简单的错误。否则根本不会发生这种情况。
      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多