SED错误-'s'命令的RHS提取XML文本的参考\ 1无效

我有一个包含多行的XML文件,如下所示。

<sandbox>false</sandbox>

<serverUrl>https://salesforce.com/services/Soap/u/37.0/</serverUrl>

<sessionId>00D4100000087K9!AQMAQJElzjgvA01eaCo</sessionId>

<userId>00541000000JOzJAAW</userId>

<userInfo>

我试图在Linux上使用sed在两个sessionId标记之间获取一个值。

sed -n '/<sessionId>.*$/{s/<sessionId>.*<\/sessionId>/\1/;p}' LoginResponse.xml

但这引发了以下错误。有什么建议请…

sed: -e expression #1, char 50: invalid reference \1 on `s' command's RHS

回答:

正确的事情

根本不要使用sed;XML不是一种正则语言,因此正则表达式在某种程度上不足以正确解析它。您当前的代码无法区分谈论sessionId标签的注释和真实的sessionId标签;无法识别元素编码;无法处理标签上存在的意外属性;等等

而是使用:

xmlstarlet sel -t -m '//sessionId' -v . -n < LoginResponse.xml

…或者,如果您没有XMLStarlet,则可以使用XSLTProc(在现代UNIXy系统上几乎都是开箱即用的)。如果将以下内容另存为extract-

session-id.xslt

<?xml version="1.0"?>

<!-- this was generated with:

-- xmlstarlet sel -C -t -m '//sessionId' -v . -n

-->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">

<xsl:output omit-xml-declaration="yes" indent="no"/>

<xsl:template match="/">

<xsl:for-each select="//sessionId">

<xsl:call-template name="value-of-template">

<xsl:with-param name="select" select="."/>

</xsl:call-template>

<xsl:value-of select="'&#10;'"/>

</xsl:for-each>

</xsl:template>

<xsl:template name="value-of-template">

<xsl:param name="select"/>

<xsl:value-of select="$select"/>

<xsl:for-each select="exslt:node-set($select)[position()&gt;1]">

<xsl:value-of select="'&#10;'"/>

<xsl:value-of select="."/>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

…然后您可以运行xsltproc extract-session-id.xslt LoginResponse.xml以获取输出。


sed

就是说,关于您的sed错误:您需要通过-r启用ERE语法:

# requires GNU sed for -r

sed -r -n -e '/<sessionId>.*$/{s/<sessionId>(.*)<\/sessionId>/\1/;p}'

另外,通过MacOS BSD sed,还需要进行其他一些调整:

# -E, not -r, on MacOS BSD sed; semicolon between "p", "}" needed.

sed -E -n '/<sessionId>.*$/ { s/<sessionId>(.*)<\/sessionId>/\1/; p; }'

如果您的会话ID曾经包含在元素后面的字符,这将表现不佳&-s看起来像&amp;这样;因此,使用适当的XML解析器是更安全的选择。(同样,如果内容曾经更改过<sessionidtype="foo">...</sessionid>,或者发生了任何其他形式的更改)。

以上是 SED错误-&#39;s&#39;命令的RHS提取XML文本的参考\ 1无效 的全部内容, 来源链接: utcz.com/qa/413387.html

回到顶部