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

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

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

根本不要使用

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 -rsed -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>
,或者发生了任何其他形式的更改)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5019098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存