获取单引号内的字符串

获取单引号内的字符串
<source file='/home/anpham/Projects/vm-builder/30G'/>

我尝试使用 sed 命令从上面的输出中提取绝对路径,但输出不会修剪字符串。以下命令是我的尝试。

virsh dumpxml --domain "test1" | grep 'source file' | head -1 | sed '/^<source$/d' 

输出仍然是:

<source file='/home/anpham/Projects/vm-builder/30G'/>

答案1

要提取XML 文档中file所有节点的所有属性的值,您可以这样使用:sourcexmlstarlet

xmlstarlet sel -t -v '//source/@file' -nl file.xml

或者,从您的virsh命令中读取:

virsh dumpxml --domain "test1" | xmlstarlet sel -t -v '//source/@file' -nl

您的管道的问题是最终sed命令尝试删除包含确切字符串<source(而不是其他字符串)的所有行。您在 的输入中没有这样的行sed

答案2

在每个 UNIX 机器上的任何 shell 中使用任何 sed:

$ sed "s/.*<source file='\([^']*\).*/\1/" file
/home/anpham/Projects/vm-builder/30G

答案3

首先:你的 sed 命令永远不会匹配任何内容,除了只包含单词 的行source。这是因为您将^(begin of line) 放在单词 之前,将$(end of line) 放在单词之后source。第二:无需 grep 和 head 即可完成:

virsh dumpxml --domain "test1" | sed -ne 's/\s*<source file=.\([^\/].*\).\/>.*/\1/; t end; b; :end; p; Q'

相关内容