gpt4 book ai didi

linux - SED 错误 - `s' 命令的 RHS 提取 XML 文本时引用\1 无效

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:30 27 4
gpt4 key购买 nike

我有一个包含多行的 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="'&#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; }'

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

关于linux - SED 错误 - `s' 命令的 RHS 提取 XML 文本时引用\1 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39667461/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com