![获取单引号内的字符串](https://linux22.com/image/168664/%E8%8E%B7%E5%8F%96%E5%8D%95%E5%BC%95%E5%8F%B7%E5%86%85%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
<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
所有节点的所有属性的值,您可以这样使用:source
xmlstarlet
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'