Copiando o segundo padrão de ocorrência para um novo arquivo no sed

1

Eu H tem um arquivo de certificado que possui 2 certificados. Começa com ---BEGIN CERTIFICATE-- e termina com ---END CERTIFICATE---- .

Exemplo:

---BEGIN CERTIFICATE--
blah1 blah1
---END CERTIFICATE----

---BEGIN CERTIFICATE--
blah2 blah2
---END CERTIFICATE----

Eu quero que o segundo conjunto seja copiado para outro arquivo.

Eu tentei seguir o comando sed , mas copiou o certificado para public.cer .

sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/w public.cer' intermediate.cer

Como copiar apenas o segundo conjunto de certificados para um novo arquivo.

    
por user284131 03.04.2018 / 15:11

3 respostas

1

Com awk padrões de intervalo :

awk '/BEGIN CERTIFICATE/ && c++,/END CERTIFICATE/' intermediate.cer > public.cer

O conteúdo do arquivo public.cer :

---BEGIN CERTIFICATE--
blah2 blah2
---END CERTIFICATE----

Um intervalo padrão é feito de dois padrões separados por uma vírgula, no formato begpat, endpat . Ele é usado para corresponder intervalos de registros de entrada consecutivos. O primeiro padrão, begpat , controla onde o intervalo começa, enquanto endpat controla onde o padrão termina.

    
por 03.04.2018 / 15:37
1

Em vez de gravar diretamente em um arquivo, você pode coletar todos os certs no espaço de retenção com H e, em seguida, na última linha ( $!d interrompe o processamento de todas as linhas, mas a última. somente para a última linha) mova o espaço de espera para o espaço de padrão com g e remova o que você deseja eliminar antes de escrever:

sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/H;$!d;g;s/.*\(---BEGIN\)//;w public.cer'
    
por 03.04.2018 / 16:21
1

Outro sed, se não encontrarmos END depois de blah2

sed ':A;$bB;/BEGIN CERTIFICATE/!d;N;/END CERTIFICATE/!bA;h;$!d;:B;x;w public.cer' intermediate.cer
    
por 03.04.2018 / 17:41