sed를 사용하여 따옴표 사이에 두 번째로 나타나는 텍스트를 필터링하시겠습니까? [복사]

sed를 사용하여 따옴표 사이에 두 번째로 나타나는 텍스트를 필터링하시겠습니까? [복사]

다음과 같은 파일의 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 표현식을 사용합니다. 입력에 더 많은 변경 사항이 있는 경우 조정이 필요합니다.

관련 정보