如何在保留文本时删除XML标记之间的所有正斜杠?

时间:2016-03-14 17:06:32

标签: regex xml awk sed notepad++

我有一些非常大的XML文件。我需要删除开始和结束XML标记之间的所有正斜杠。 foward斜线可以用空格代替。我需要在不删除结束HTML标记的正斜杠的情况下执行此操作。非常感谢任何帮助!

此:

<XML>
<REDACTED27> CT LSPINE W/O CONT XR29 </REDACTED27>
<sampletag>str1/str2/str3</sampletag>
</XML>

成为这个:

<XML>
<REDACTED27> CT LSPINE W O CONT XR29 </REDACTED27>
<sampletag>str1 str2 str3</sampletag>
</XML>

5 个答案:

答案 0 :(得分:4)

使用解析实际XML的XML感知工具。例如,在Spring docs中,您只需编写

即可
open file.xml ;
for //text() set . xsh:subst(., '/', ' ', 'g') ;
save :b ;

答案 1 :(得分:3)

最好不使用sed,awk或任何其他文本编辑实用程序。

使用XML编辑实用程序,例如XSLT。

以下转换使输入保持不变(除非从中缩进,但您可以禁用它)并且只修改文本节点(即开始和结束XML标记之间的东西):

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="translate(., '/', ' ')" />
    </xsl:template>
</xsl:transform>

另存为例如removeslashes.xsl并在命令行中使用xsltproc

xsltproc -o outputfile.xml removeslashes.xsl inputfile.xml

答案 2 :(得分:1)

您应该安装xmlstarlet,然后基本上安装:

xmlstarlet pyx source.xml | perl -pe 'm/^-/ && s/\// /g' | xmlstarlet p2x > target.xml

在pyx中,以“ - ”开头的行表示文本节点,因此您可以替换它们中的斜杠并将xml组合回来而不会触及任何其他内容。

答案 3 :(得分:0)

当您添加notepad++代码时,我建议在“查找内容”(以及“替换为”中的空格)中使用此Ctrl+H替换所有内容(regex

(?<!<)/(?!>)

负面的背后隐藏(?<!<)确保<之前没有任何字符/,而负向前瞻(?!>)确保之后没有> 。在这里,我假设没有<//>出现在标记之外,以便更快地处理“非常大的XML文件”。

答案 4 :(得分:0)

缺少xml感知工具,这适用于简单结构

$ sed -r 's_([^<])/([^>])_\1 \2_g' xml

<XML>
<REDACTED27> CT LSPINE W O CONT XR29 </REDACTED27>
<sampletag>str1 str2 str3</sampletag>
</XML>
<test/>