sed извлекает текст между двумя xml тегами с учетом регистра - PullRequest
0 голосов
/ 18 марта 2020

Я хочу получить строку между тегом без учета регистра.

Образец. xml:

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

Или

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

I сделал, как показано ниже, работает нормально, но без учета регистра.

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

Здесь name без учета регистра, как с этим справиться.

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

При обработке документов 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 не имеет таких ограничений)

Вывод такой же.

1 голос
/ 19 марта 2020

Шаблон xslt можно использовать для нормализации регистра перед выбором с помощью xmlstarlet. Обратите внимание, что теперь все элементы в xpath строчные.

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

element-name-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
1 голос
/ 18 марта 2020

Я думаю, что вы ищете это

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