引用符で囲まれた値を含む文字列を空白に分割する方法

引用符で囲まれた値を含む文字列を空白に分割する方法

次のbashの例を見てください(実際の出力はから来ていることに注意してくださいvboxmanage list vms)。

TEST='"ubuntu server" foo bar'
echo $TEST
"ubuntu server" foo bar

(ループまたは別の変数から)3つの値をどのように分離できますか?私が見つけたすべての解決策はスペース区切りに依存し、最初の値を破壊します。

ベストアンサー1

VirtualBoxシステムの名前を繰り返すことができます。

vboxmanage list -l vms | sed -n 's/^Name:[[:blank:]]*//p' |
while IFS= read -r vm_name; do
   printf 'There is one VM called "%s"\n' "$vm_name"
done

長い形式を使用してシステムを一覧表示し、名前を解析します。その後、これらの名前はシェルループから読み取られ、各名前に対して短いメッセージが印刷されます。

名前を配列として読むこともできます。

readarray -t vm_names < <(vboxmanage list -l vms | sed -n 's/^Name:[[:blank:]]*//p')
printf 'There is one VM called "%s"\n' "${vm_names[@]}"

ここでは、名前のリストが赤色で配列に入力されますvm_names。次のようにこの配列を繰り返すことができます。

for vm_name in "${vm_names[@]}"; do
   # Use "$vm_name" here
done

UUIDも使用できます。

vboxmanage list -l vms |
sed -n \
    -e '/^Name:[[:blank:]]*/{ s///; h; }' \
    -e '/^UUID:[[:blank:]]*/{ s///; G; y/\n/@/; p; }' |
while IFS=@ read -r vm_uuid vm_name; do
    printf 'VM "%s" has UUID "%s"\n' "$vm_name" "$vm_uuid"
done

おすすめ記事