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

时间:2014-05-01 19:31:03

标签: xml vim sed

如何替换特定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>

4 个答案:

答案 0 :(得分:1)

如果只有一个这样的范围,以下将会这样做:

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

这会在(打开/关闭)标记分隔的范围内执行:substitute命令。示例添加 <br/>代码,如果您想将所有内容压缩为一行,请搜索\n而不是$\n\s*删除缩进)。

如果要替换多个此类标记,请在命令前加:global。这将执行替换(此时间从包含开始标记的当前行到下一个结束标记),用于缓冲区中找到的所有标记(您可以通过预先设置不同的范围来再次影响,例如{ {1}})。

答案 1 :(得分:0)

您可以使用宏:

  1. qq开始录制
  2. /content:encoded<cr>转到下一个标记。注意<cr>表示按Enter键。
  3. vit直观地选择标记
  4. :'<,'>s/\n\s*/<br\/>/g<br/>替换所有换行后跟任意数量的空格。请注意,'<,'>将由vim自动添加。
  5. q停止录制
  6. 5@q重复5次。
  7. 它可能也可能使用正则表达式,但我的正则表达式不是那个。

答案 2 :(得分:0)

使用适当的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 ;

答案 3 :(得分:0)

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

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