如何從指令的輸出中提取帶引號的字串的內容?

如何從指令的輸出中提取帶引號的字串的內容?

我的輸出VBoxManage list vms如下圖所示:

"arch" {de1a1db2-86c5-43e7-a8de-a0031835f7a7}   
"arch2" {92d8513c-f13e-41b5-97e2-2a6b17d47b67}  

我需要獲取名稱arch並將arch2它們保存到變數中。

答案1

使用 grep + sed

這將解析這兩個字串的內容:

$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2

上面的程式碼尋找與模式相符的字串".*"。這將符合雙引號內出現的任何內容。因此grep將傳回這些類型的值:

"arch"
"arch2"

管道 tosed將從這些字串中去除所有雙引號,從而提供您要查找的字串。此符號sed 's/"//g'指示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

使用 的grepPCRE 功能,您可以尋找以雙引號開頭或以雙引號結尾的任何子字串,並僅報告子字串。

答案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 }')

請注意,在現代 shell 中,您也可以使用陣列來取代普通變數。在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

相關內容