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

时间:2016-03-12 19:21:43

标签: xml bash xpath xmlstarlet

我想匹配xml属性中的日期。我尝试过以下命令:

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

我还尝试用bash变量替换bash表达式。我使用过单引号和双引号,正常和圆括号,没有骰子。

1 个答案:

答案 0 :(得分:0)

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

copy

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' # | ^| |^ | # ||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||| 下面有"个字符作为LITERAL:它们被周围的单引号转义,因此成为传递给xmlstarlet的字符串的一部分。不被^包围的另一个"是语法的:它们是对shell的指令,'扩展的内容不是分词或全局扩展的。 (管道显示字符串的哪些部分是单引号,但需要注意的是,结尾的单引号是语法而不是字面引用,因此实际上并没有引用它们。)

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

  • $(date) - 单引号,包括最后的文字'string(//*[local-name()="***"][@date="'
  • " - 双引号。
  • "$(date +'%b %d $y')" - 单引号,包括文字'"]/@...)'