답변:
이 두 문자열의 내용을 구문 분석합니다.
$ 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 's/^"\(.*\)".*/\1/' a
arch
arch2
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
명령 tr
을 사용하여 문자를 삭제할 수 있습니다. 이 경우 큰 따옴표를 삭제합니다.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
사용 grep
당신은 큰 따옴표와 큰 따옴표 또는 종료로 시작하고 바로 문자열을보고 어떤 문자열을 찾아 '의 PCRE 기능을 할 수 있습니다.
/address/
에 sed
같은 sed '/^"\(arch[^"]*\)/s//\1/
당신이 해당 문자열이 포함 된 라인에서 작동 할 수 있습니다.
sed
실제로해야 한다는 것을 깨달았습니다 s/^"\([^"]*\)".*/\1/
.
로에게 sed
당신이 할 수 있습니다 :
var=$(VBoxManage list vms | sed 's/^"\([^"]*\).*/\1/')
설명:
s/.../.../
-일치 및 교체^
-라인 시작시 일치\(...\)
-이것은 역 참조이므로 나중에 여기에서 일치하는 것을 참조 할 수 있습니다. \1
[^"]*
-를 포함하지 않는 시퀀스와 일치합니다 "
(즉, 다음 시퀀스 까지 "
)..*
-나머지 줄과 일치\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]}"
변수를 사용할 때 더 쉬울 수 있습니다.
그리고 --perl-regexp
옵션을 가진 하나의 라이너를 통해
VBoxManage list vms | grep -oP '(?<=^\")[^"]*'
설명:
(?<=^\")[^"]*
-> 여기에 lookbehind가 사용됩니다. 모든 문자와 일치하지만 "
0 번 이상 일치하지 않습니다 (한 번 큰 따옴표를 찾으면 일치하지 않습니다). 큰 따옴표 바로 뒤에 있습니다 (큰 따옴표로 시작하는 줄 만).
또 다른 미운 해킹을 통해 sed
,
$ sed '/.*\"\(.*\)\".*/ s//\1/g' file
arch
arch2
tr -d \"
따옴표를 삭제하는 또 다른 방법입니다. (tr
일반적으로 한 문자 세트를 다른 문자 세트로 변환-d
하고 대신 삭제하도록 지시합니다.)