【问题标题】:sed extract text between two xml tags with case insensitivesed 在不区分大小写的两个 xml 标记之间提取文本
【发布时间】:2020-06-29 22:26:50
【问题描述】:

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

Sample.xml:

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

或者

&lt;Sample&gt;&lt;emp&gt;&lt;id&gt;1234&lt;/id&gt;&lt;name&gt;Raj&lt;/name&gt;&lt;/emp&gt;&lt;/Sample&gt;

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

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

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

【问题讨论】:

    标签: bash shell centos7


    【解决方案1】:

    在处理 XML 文档时,您需要使用可识别 xml 的实用程序。 sed 和 awk 不提供任何验证 XML 的方法。例如,使用xmlstarlet,您将使用:

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

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

    这将检索Raj 作为输出。

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

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

    (注意:您基本上错过了锚定行首和行尾的 '^' 和 '$'。这个 sed 表达式仅在 XML 都在同一行时才有效,适当的 XML 实用程序没有这样的限制)

    输出是一样的。

    【讨论】:

    • 你在哪里使它不区分大小写?
    • 这没有回答我的报价。我需要不区分大小写
    • 然后使用上面的sed 选项——它不区分大小写。
    • 我的 xml 是格式化的,这里我把它放在单行 sed 不适用于格式化的 xml。
    • 我把你的输入放在Sample.xml文件中,就像你展示的那样,每次输出都是Raj - - 你在LINux,Mac,Windows WSL上 - 你有吗GNU sed 或不同的东西。上面的sed 不包含任何特定于 GNU 的内容,所以我不确定问题是什么。如果您的文件来自 Windows 并且是 UTF-16 - 这将是一个问题。 file Sample.xml 显示什么?
    【解决方案2】:

    我想你正在寻找这个

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

    【讨论】:

    • 这仍然是区分大小写的。
    • 不,这不区分大小写。我厌倦了所有情况。
    【解决方案3】:

    在使用 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
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2013-05-14
      • 2017-12-13
      相关资源
      最近更新 更多