명령 출력에서 ​​따옴표 붙은 문자열의 내용을 추출하는 방법은 무엇입니까?

명령 출력에서 ​​따옴표 붙은 문자열의 내용을 추출하는 방법은 무엇입니까?

내 출력은 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'나타냅니다 . 그 명령 은 거기서 일어나는 일이며, 검색의 꼬리는 주어진 전체 문자열에 대해 전역적으로 이 작업을 수행하도록 지시합니다.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

관련 정보