다음과 같은 파일의 grep 출력이 있습니다.
"name" "Andrew Spokes"
이름을 추출하기 위해 grep의 출력을 파이프하고 싶습니다 sed
.
내 예상 결과는 다음과 같습니다
Andrew Spokes
따옴표 사이의 공백도 모두 제거해 달라고 요청합니다.
답변1
한 가지 방법은 다음과 같습니다.
... |sed -r 's/^"[^"]*" *"([^"]*)"$/\1/'
Andrew Spokes
또 다른:
sed -r 's/(([^"]*"){3})//; s/"//'
또는:
sed -r 's/.*"(.*)"$/\1/'
이는 [^"]
가 아닌 모든 단일 문자와 일치합니다 "
.
답변2
다음 표현식은 GNU sed에서 작동합니다.
sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
이는 전체 줄과 일치하는 정규식과 원하는 이름이 있는 이름 부분과 일치하는 하위 표현식을 생성하여 수행됩니다. 괄호 안의 부분으로, 큰따옴표가 아닌 일련의 문자입니다. 일치하는 전체 정규 표현식은 \1
표현식 끝에 인용된 하위 표현식으로 대체됩니다 .
이것이 어떻게 작동하는지에 대한 예를 들면 다음과 같습니다.
$ # Generate lines in the expected format
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"'
"name" "Andrew Spokes"
"name" "ABC"
"name" "Foo Bar Baz"
$ # Pipe the same lines to the sed command
$ echo $'"name" "Andrew Spokes"\n"name" "ABC"\n"name" "Foo Bar Baz"' | sed -E 's/^"name"[[:space:]]*"([^"]+)"$/\1/'
Andrew Spokes
ABC
Foo Bar Baz
GNU 정규식에 대한 경험이 제한적이라면 다음 사이트에서 위의 정규식에 사용된 구문을 찾아보는 것이 도움이 될 수 있습니다.GNU sed 매뉴얼. 다른 스타일의 sed를 사용하는 경우 세부 사항이 약간 다를 수 있습니다. 하나의 주석은 -E
"확장된" 정규식을 활성화하는 옵션입니다. GNU sed에는 하위 표현식과 역참조를 이스케이프하지 않고 생성한다는 의미를 갖는 괄호 및 백슬래시와 같은 특수 문자가 있습니다. 또 다른 방법은 줄의 시작과 끝에서 일치하는 완전한 정규식을 사용 ^
하고 요구하는 것입니다.$
또 다른 주석은 모든 입력 라인에서 균일성을 가정하는 sed 표현식을 사용합니다. 입력에 더 많은 변경 사항이 있는 경우 조정이 필요합니다.