한 쌍의 문자열이 처음 나타나는 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

한 쌍의 문자열이 처음 나타나는 사이에 텍스트를 인쇄하는 방법은 무엇입니까?

2개의 디지털 인증서가 포함된 파일의 일부를 필터링하려고 합니다. 기본적으로 나는 두 번째 부분(Cert2)이 아닌 첫 번째 부분(Cert1)을 원합니다.

파일 내용은 다음과 같습니다.

-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----

나는 이것이 나에게 Cert1의 콘텐츠를 제공할 것이라는 인상을 받았습니다.(첫 번째 BEGIN과 첫 번째 END 사이의 첫 번째 부분):

cat /etc/nginx/cert.pem | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

하지만 어떤 이유로든 여전히 두 번째 BEGIN과 두 번째 END 사이의 모든 내용이 표시됩니다.(기본적으로 아무것도 바뀌지 않습니다. 모든 내용은 동일합니다.).

어떤 조언이 있습니까?

답변1

거의 다 왔어요:

sed -ne '
   /-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p      # got the range, ok
   /-END CERTIFICATE-/q                            # bailing out soon as the cert end seen
' /etc/nginx/cert.pem

그러나 인증서 시작 및 끝 표시 줄도 출력의 일부라는 점에 유의하세요.

답변2

이 작업에는 다음 sed 명령을 사용할 수 있습니다

sed '/-----END CERTIFICATE-----/q' /etc/nginx/cert.pem

qsed에게 종료를 지시하는 종료 코드입니다. 따라서 sed는 파일의 시작 부분부터 인쇄하고 '-----END CERTIFICATE-----' 패턴이 나타나면 종료됩니다. 이로 인해 첫 번째 인증서가 끝나면 중지됩니다.

또한 cat의 출력을 sed로 리디렉션하기 위해 파이프를 사용할 필요가 없습니다. sed 명령에 파일 이름을 지정하기만 하면 됩니다.

원천 -http://www.theunixschool.com/2011/09/sed-selective-printing.html

관련 정보