sed를 올바르게 사용하여 "" 문자 이외의 텍스트를 삭제하는 방법은 무엇입니까?

sed를 올바르게 사용하여 "" 문자 이외의 텍스트를 삭제하는 방법은 무엇입니까?

aaaaaa"bbbbb"aaaa출력하고 싶은 텍스트가 있습니다.bbbbb

나는 이것을 시도했지만 문자 sed -e 's/"\(.*\)"/\1/'만 잘립니다 . "이것을 올바르게 필터링하려면 어떻게 해야 합니까?

답변1

쉽게 작업하세요 cut.

텍스트가 표준 입력에서 오는 경우:

echo 'aaaaaa"bbbbb"aaaa' | cut -d\" -f2

텍스트가 다음 이름의 파일에 있는 경우 filename:

cut -d\" -f2 filename

명령 설명 cut:

  • -d\"cut구분 기호가 "( \is는 이스케이프에 사용됩니다. 그렇지 않으면 쉘이 닫히지 않은 따옴표에 대해 불평합니다)라고 알려주세요 .
  • -f2cut두 번째 필드를 가져오라고 지시합니다 ( "위의 내용으로 구분됨).

답변2

sed단지 명령의 "오른쪽"에 있는 내용을 출력하는 것이 아닙니다 s. 이는 왼쪽 일치 항목을 오른쪽 항목으로 대체하고 결과 행(또는 보다 기술적으로 말하면 패턴 공간)을 출력합니다.

echo 'aa"bb"aa'|sed 's/"\(.*\)"/\1/'

정규식의 왼쪽은 과 일치합니다 "bb". 이는 캡처 그룹에서 캡처한 항목으로 대체됩니다 bb. 따라서 출력은 aabbaa.

위 내용은 다음과 일치함을 알려드립니다.

echo 'aa"bb"aa'|sed 's/.*"\(.*\)".*/\1/'

이 정규식은 전체 줄과 일치하므로 aa"bb"aa로 대체됩니다 . bb이것이 출력입니다.

또 다른 가능한 도구는 다음과 같습니다 awk.

echo 'aa"bb"aa'|awk -F '"' '{print $2}'

이는 "구분 기호로 사용되며 두 번째 필드를 인쇄합니다.

답변3

솔루션 을 원할 때 sed다음과 결합된 솔루션이 있습니다 tr.

echo 'aaaaaa"bbbbb"aaaa' | tr '"' '\n' | sed -n 2p

또는 다음을 사용하십시오 awk.

echo 'aaaaaa"bbbbb"aaaa' | awk -F'"' '{print $2}'

(저는 여전히 을 선호합니다 cut. 참조하세요.@GMaster의 답변).

답변4

grep해결 방법(미리보기를 사용하므로 PCRE 옵션):

grep -oP '(?<=")[^"]*(?=")'

관련 정보