我想匹配 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'
# | ^| |^ |
# ||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||
"
s 下面有 ^
个字符作为 LITERAL:它们被周围的单引号转义,从而成为传递给 xmlstarlet 的字符串的一部分。其他"
,没有被'
包围,是语法的:它们是对 shell 的指令,即$(date)
扩展的内容不得拆分单词或 glob 扩展。(管道显示字符串的哪些部分是单引号,但需要注意的是,末尾的单引号是语法而不是文字,因此实际上并没有引用自己)。
查看 shell 连接成单个参数列表元素的不同引号子字符串可能更容易:
-
'string(//*[local-name()="***"][@date="'
- 单引号,包括末尾的文字"
。 -
"$(date +'%b %d $y')"
- 双引号。 -
'"]/@...)'
- 单引号,包括开头的文字"
。