我有一个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不是一种常规语言,所以regular expressions are categorically not powerful enough to parse it correctly。当前代码无法区分谈论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="' '"/>
</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()>1]">
<xsl:value-of select="' '"/>
<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看起来像&
等等,那么这将表现得很糟糕;因此使用适当的xml解析器是更安全的选择。(同样,如果内容发生了这样的变化,或者发生了其他任何形式的变化)。关于linux - SED错误-'s'命令的RHS提取XML文本的引用\1无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39667461/