在xmlstarlet(xpath)表达式中引用bash变量或bash表达式

在xmlstarlet(xpath)表达式中引用bash变量或bash表达式,xml,bash,xpath,xmlstarlet,Xml,Bash,Xpath,Xmlstarlet,我想在xml属性中匹配一个日期。我尝试了以下命令: xmlstarlet sel -t -v 'string(//*[local-name()="***"][@date="$(date +'%d %b %y')"]/@...)' file.xml 我还尝试用bash变量替换bash表达式。我使用了单引号和双引号、普通括号和卷曲括号以及无骰子。在打开双引号之前,您需要关闭单引号;否则,单引号引用双引号,因此它们没有效果 xmlstarlet sel -t -v \ 'string(//*[l

我想在xml属性中匹配一个日期。我尝试了以下命令:

xmlstarlet sel -t -v 'string(//*[local-name()="***"][@date="$(date +'%d %b %y')"]/@...)' file.xml

我还尝试用bash变量替换bash表达式。我使用了单引号和双引号、普通括号和卷曲括号以及无骰子。

在打开双引号之前,您需要关闭单引号;否则,单引号引用双引号,因此它们没有效果

xmlstarlet sel -t -v \
  'string(//*[local-name()="***"][@date="'"$(date +'%b %d $y')"'"]/@...)' file.xml

# 'single-quoted content here"'"double-quoted content here"'"single-quoted content here'
# |                          ^|                            |^                          |
# |||||||||||||||||||||||||||||                            |||||||||||||||||||||||||||||
下面带有
^
字符的
作为文本:它们由围绕它们的单引号转义,从而成为传递给xmlstarlet的字符串的一部分。另一个
,不由
包围,是语法:它们是指向shell的指令,用于指示
$(日期)的内容
扩展不能进行分词或全局扩展。(管道显示字符串的哪些部分是单引号,但需要注意的是,末尾的单引号是语法性的,而不是文字性的,因此实际上并没有引用它们自己)

查看shell连接到单个参数列表元素中的不同引号的子字符串可能更容易:

  • '字符串(//*[local-name()=“***”][@date=“”
    -单引号,包括末尾的文本
  • “$(日期+'%b%d$y')”
    -双引号
  • “]/@…”
    -单引号,包括开头的文字

准确展示您的尝试。双引号应该有效。@choroba,更正:如果您先关闭单引号,双引号应该有效,而OP没有这样做。您能显示您尝试过的其他命令,以及每个命令的错误消息吗?是的,这是个问题。我有点困惑,下面带有
^
字符的双引号包围了单引号,反之亦然。为什么bash表达式需要再次用双引号包围?当我尝试“$(日期+'%b%d%y')”时,我得到一个无效的谓词,并看到该日期已正确展开。到底传递给xmlstarlet的是什么?@cfye14,请将其视为三个单独的字符串,就像我稍后将其拆分的方式:单引号实际上是围绕在这些子字符串的第一个和第三个中的双引号周围的字符串。@cfye14,如果要查看传递给xmlstarlet的确切字符串,请使用
printf“%s\n”字符串(//*[local-name()=“***]”[@date=“”$(日期+“%b%d$y”)“]/@…”