<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
file
XML文書内のすべてのノードのすべての属性値を抽出するには、以下を使用できます。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 システムのすべてのシェルで sed を使用します。
$ sed "s/.*<source file='\([^']*\).*/\1/" file
/home/anpham/Projects/vm-builder/30G
答え3
まず、sedコマンドは、単語だけを含む行を除いて、何も一致しませんsource
。これは、^
単語の前に(行の先頭)を、$
単語の後に(行の終わり)を置くためですsource
。第二:grepやheadなしで可能です。
virsh dumpxml --domain "test1" | sed -ne 's/\s*<source file=.\([^\/].*\).\/>.*/\1/; t end; b; :end; p; Q'