【问题标题】:vim: How to replace line breaks within a specific XML node?vim:如何替换特定 XML 节点中的换行符?
【发布时间】:2023-03-10 01:30:02
【问题描述】:

如何替换特定 XML 节点中的换行符?

例如:^J 到 <br/> 内 <content:encoded></content:encoded>

代码示例:

    <content:encoded><![CDATA[
      Communities across the Northwest Territories have harvested a bumper crop

      of produce ranging from potatoes and carrots to spinach and lettuce thanks to

      dedicated community gardeners and the Government of the Northwest Territories’ (GNWT).
    ]></content:encoded>

【问题讨论】:

    标签: xml vim sed


    【解决方案1】:

    我认为解决方案是直观地选择行,然后 :s#\n#&lt;br/&gt;\r#g - 它会将行尾替换为 &lt;br/&gt;。

    如果你想在每个内部标签中替换它,那么你应该使用: :g /<content:encoded>/;/\/content:encoded/ s#\n#<br/>\r#g

    【讨论】:

      【解决方案2】:

      你可以使用宏:

      1. qq开始录制
      2. /content:encoded&lt;cr&gt; 转到下一个标签。注意&lt;cr&gt; 表示回车。
      3. vit 在标签中视觉选择
      4. :'&lt;,'&gt;s/\n\s*/&lt;br\/&gt;/g 用&lt;br/&gt; 替换所有后跟任意数量空格的换行符。请注意,'&lt;,'&gt; 将由 vim 自动添加。
      5. q停止录音
      6. 5@q 重复 5 次。

      也可能使用正则表达式,但我的正则表达式 foo 达不到。

      【讨论】:

        【解决方案3】:

        使用适当的 XML 处理工具。例如xsh:

        open file.xml ;
        for my $text in //content:encoded/text() {
            my $lines = xsh:split("\n", $text) ;
            for $lines {
                my $t := insert text (.) before $text ;
                insert element br before $text ;
            }
            delete $text;
        }
        save :b ;
        

        【讨论】:

          【解决方案4】:

          如果只有一个这样的范围,则可以执行以下操作:

          /<content:encoded>/,/<\/content:encoded>/s#$#<br/>#
          

          这会在由(开始/结束)标签分隔的范围内执行:substitute 命令。示例添加 &lt;br/&gt; 标记,如果要将所有内容压缩到一行,请搜索 \n 而不是 $(\n\s* 也可以删除缩进)。

          如果您要替换多个此类标签,请在命令前添加 :global。这将为缓冲区中找到的 all 标记执行替换(这次是从包含开始标记的当前行到下一个结束标记)(您可以通过预先设置不同的范围来再次影响,例如 @ 987654328@).

          【讨论】:

          • 我确信其他解决方案也同样出色,但这个对我来说非常有效。 global/&lt;content:encoded&gt;/,/&lt;\/content:encoded&gt;/s#$#&lt;br/&gt;#
          • 谢谢!不要忘记接受答案(点击旁边的勾号)。
          猜你喜欢
          • 2013-12-30
          • 1970-01-01
          • 2014-03-11
          • 2021-01-30
          • 2010-09-09
          • 1970-01-01
          相关资源
          最近更新 更多