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 感知实用程序。 sed
和 awk
不提供任何验证 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
我想获取不区分大小写的标签之间的字符串。
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 感知实用程序。 sed
和 awk
不提供任何验证 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