내 출력은 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"
Pipe to는 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