我的输出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