
出力はVBoxManage list vms
次のようになります:
"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}
名前を取得しarch
てarch2
変数に保存する必要があります。
答え1
grep + sedを使用する
これにより、次の 2 つの文字列の内容が解析されます。
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
上記は、パターンに一致する文字列を検索します".*"
。これは、二重引用符で囲まれたすべてのものに一致します。したがって、grep
次のタイプの値が返されます。
"arch"
"arch2"
パイプ to は、sed
これらの文字列から二重引用符を取り除き、探している文字列を提供します。この表記は、すべての二重引用符に対して検索と置換を実行し、何もないものに置き換えるようにsed 's/"//g'
指示しています。コマンドはそこで行われていることであり、末尾の search は、指定された文字列全体に対してグローバルに実行するように指示しています。sed
s/"//g
s/find/replace/g
g
sedだけを使う
また、を使用してsed
、先頭の二重引用符を切り取り、その間にあるものを保持し、残りの引用符とその後のすべての部分を切り取ることもできます。
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
その他の方法
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
このコマンドはtr
文字を削除するために使用できます。この場合は二重引用符を削除します。
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
grep
の PCRE 機能を使用すると、二重引用符で始まる、または二重引用符で終わる部分文字列を検索し、その部分文字列だけを報告できます。
答え2
それは次の人の別の仕事ですcut
:
VBoxManage list vms | cut -d \" -f2
答え3
を使用するとsed
次のことができます:
var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')
説明:
s/.../.../
- 一致と置換^
- 行の先頭に一致\(...\)
- これは後方参照です。ここで一致したものを後で参照することができます。\1
[^"]*
- を含まない任意のシーケンスに一致します"
(つまり、次の まで"
)。.*
- 行の残りの部分と一致\1
- 後方参照に置き換える
または、以下を使用しますawk
:
var=$(VBoxManage list vms | awk -F\" '{ print $2 }')
最近のシェルでは、通常の変数の代わりに配列を使用することもできます。次のようにbash
実行できます。
IFS=$'\n'; set -f
array=( $(VBoxManage list vms | awk -F\" '{ print $2 }') )
echo "array[0] = ${array[0]}"
echo "array[1] = ${array[1]}"
変数を使用する場合は、これが簡単になるかもしれません。
答え4
bash を使用する場合、次のように記述します。
while read vm value; do
case $vm in
'"arch"') arch=$value ;;
'"arch2"') arch2=$value ;;
esac
done < <( VBoxManage list vms )
echo $arch
echo $arch2