
我的輸出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
使用 的grep
PCRE 功能,您可以尋找以雙引號開頭或以雙引號結尾的任何子字串,並僅報告子字串。
答案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