
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"
파이프는 sed
이러한 문자열에서 큰따옴표를 제거하여 원하는 문자열을 제공합니다. 이 표기법은 모든 큰따옴표에 대해 검색 및 바꾸기를 수행하고 이를 아무것도 없는 것으로 대체하도록 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
의 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