コマンド出力から引用符付き文字列の内容を抽出する方法は?

コマンド出力から引用符付き文字列の内容を抽出する方法は?

私の出力は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"

Pipe toは、sedこれらの文字列からすべての二重引用符を削除して、必要な文字列を提供します。この記号は、すべての二重引用符を検索して何もないものに置き換えることをsed 's/"//g'示します。そのコマンドはそこで起こるものであり、検索の尾は与えられた文字列全体に対してグローバルにこれを行うように指示します。seds/"//gs/find/replace/gg

ただsedを使う

また、それを使用してsed開く二重引用符を切り取り、それらの間にある内容を保持し、残りの引用符とその後のすべての内容を切り取ることもできます。

$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2

他の方法

$ grep -o '".*"' somefile | tr -d '"'
arch
arch2

このコマンドはtr文字を削除するために使用できます。この場合、二重引用符を削除します。

$ grep -oP '(?<=").*(?=")' somefile
arch
arch2

PCRE関数を使用すると、grep二重引用符で始まるか、二重引用符で終わり、部分文字列のみを報告するすべての部分文字列を見つけることができます。

答え2

もう一つの仕事は次のとおりですcut

VBoxManage list vms | cut -d \" -f2

答え3

私達は一緒にsedできます:

var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')

説明する:

  • s/.../.../- 一致と交換
  • ^- 行の先頭に一致
  • \(...\)- これは逆参照です。ここで一致する内容は後で参照できます。\1
  • [^"]*- aを含まないすべてのシーケンスと一致します"(つまり、次のシーケンスまで")。
  • .*- 残りの行と一致
  • \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

関連情報