当前位置: 首页 > 面试题库 >

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

常海
2023-03-14
问题内容

我有一个包含多行的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,我看到了这个SED替换示例。它应该在每一行中将第一个小写t替换为大写: 文件内容: 不过,这并不是世界末日,因为我可以将其输出到一个新文件中: 但是如果我想编辑原始文件,我该怎么办?

  • 问题内容: 我正在使用docker并使用以下命令: 指向我的应用程序文件按角度编译的文件夹。 我首先转到文件夹,然后从那里运行命令。一切正常,我能够通过port:进入应用程序,但是在docker更新之后,我运行错误: docker:无效的参考格式。请参阅’docker run –help’。 我一直在搜索并检查以下发布的docker:无效的参考格式,但这似乎与我的问题不同。这是基于命令的信息 :

  • - 轻量级流编辑器,一般用来处理文本类文件 sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上 用 sed -i 会实际写入,下面为了演示,都没加该参数,有需要可以自行添加。 基础例子 有一个文件:/opt/log4j2.properties status = error

  • 本文档是 Redis 命令参考手册的中文翻译版, 可以在 www.RedisDoc.com 在线阅读本文档。

  • 我是科尔多瓦的新手,所以如果我的问题不相关,请原谅我。我的Windows7x64机器中有一个cordova项目。昨天,我通过构建了我的cordova应用程序。但是我需要添加新的插件来更新我的cordova项目。我做了什么来添加这个插件到我的cordova应用程序; null 构建失败C:\android\sdk\tools\ant\BUILD.xml:720:执行这一行时发生以下错误:C:\and

  • 问题内容: 我是科尔多瓦的新手,所以如果我的问题不相关,请原谅我。我在Windows 7 x64计算机上有一个cordova项目。昨天,我通过构建了Cordova应用。但是我需要添加新的插件来更新我的cordova项目。我将该插件添加到我的cordova应用程序中所做的工作; 我在win7 x64 env上安装了git应用程序。 我在cmd上写了这个命令。 我打开Windows环境变量/路径窗口并