명령 출력에서 ​​따옴표로 묶인 문자열의 내용을 어떻게 추출합니까?

명령 출력에서 ​​따옴표로 묶인 문자열의 내용을 어떻게 추출합니까?

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'지시합니다 . 명령은 거기에서 일어나는 일이며, 검색에 대한 후행은 주어진 전체 문자열에 대해 전역적으로 수행하도록 지시합니다.seds/"//gs/find/replace/gg

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

관련 정보