Como imprimir o texto entre a primeira ocorrência de um par de strings?

Como imprimir o texto entre a primeira ocorrência de um par de strings?

Estou tentando filtrar uma parte de um arquivo que contém 2 certificados digitais. Basicamente, quero a primeira parte (digamos Cert1) e não a segunda parte (Cert2).

O conteúdo do arquivo é:

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

Fiquei com a impressão de que isso me daria o conteúdo do Cert1(a primeira parte entre o primeiro BEGIN e o primeiro END):

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

Por alguma razão, porém, ainda me apresenta todo o conteúdo entre o segundo BEGIN e o segundo END(basicamente, nada muda; todo o conteúdo é o mesmo).

Alguma indicação?

Responder1

Você estava quase lá:

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

Mas observe que as linhas do marcador inicial e final do certificado também fazem parte da saída.

Responder2

Você pode usar o seguinte comando sed para esta tarefa

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

qé um código de saída que instrui o sed a sair. Portanto, sed será impresso desde o início do arquivo e encerrado quando o padrão '-----END CERTIFICATE-----' for encontrado. Isso faz com que ele pare no final do primeiro certificado.

Além disso, não há necessidade de usar um pipe para redirecionar a saída de cat para sed. Basta especificar o nome do arquivo no comando sed.

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

informação relacionada