如何从命令的输出中提取带引号的字符串的内容?

如何从命令的输出中提取带引号的字符串的内容?

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

相关内容