sed 在不区分大小写的两个 xml 标签之间提取文本

sed extract text between two xml tags with case insensitive

我想获取不区分大小写的标签之间的字符串。

Sample.xml:

<Sample> <emp> <id>1234</id> <name>Raj</name> </emp> </Sample>

<Sample><emp><id>1234</id><name>Raj</name></emp></Sample>

我确实喜欢下面的内容,它工作正常但不区分大小写。

sed -n 's:.*<name>\(.*\)</name>.*::p' Sample.xml

这里name不区分大小写,请问如何处理。

处理 XML 文档时需要使用 xml 感知实用程序。 sedawk 不提供任何验证 XML 的方法。例如,使用 xmlstarlet 您将使用:

xmlstarlet sel -t -v "/Sample/emp/name" Sample.xml

注意: 节点名称 xmlstarlet 区分大小写。使用前请查询 XML 结构的正确大小写)

这将检索 Raj 作为输出。

如果您确实想使用 sed(不推荐),您可以这样做:

sed 's/^.*<naME>\([^<]*\)<\/name>.*$//gI' Sample.xml

(注意: 你基本上缺少锚点 '^''$' 锚定行的开头和结尾。这个 sed 表达式仅当 XML 都在同一行时才有效,正确的 XML 实用程序没有此类限制)

输出是一样的。

我想你正在找这个

sed -n 's:.*<namE>\(.*\)</Name>.*::pgI' Sample.xml

在使用 xmlstarlet 进行选择之前,可以使用 xslt 模板规范化大小写。请注意,xpath 中的元素现在全部为小写。

xmlstarlet sel -t -v "/sample/emp/name" <(xsltproc element-name-tolower.xsl Sample.xml)

元素名称-tolower.xsl:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    <xsl:template match="*">
        <xsl:variable name="elemName" select="translate(name(.), $uppercase, $lowercase)"/>
        <xsl:element name="{$elemName}">
            <xsl:copy-of select="@*" />
            <xsl:apply-templates select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Sample.xml:

<Sample>
    <emp>
        <id>1234</id>
        <nAme>Raj</nAme>
    </emp>
</Sample>

输出:

Raj