将第二次出现模式复制到 sed 中的新文件

将第二次出现模式复制到 sed 中的新文件

我有一个证书文件,其中有 2 个证书。开始于---BEGIN CERTIFICATE--并结束于---END CERTIFICATE----

例子:

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

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

我希望将第二组复制到另一个文件。

我已尝试以下sed命令,但它将证书复制到public.cer.

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

如何仅将第二个证书复制到新文件?

答案1

awk 范围模式:

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

文件内容public.cer

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

A范围模式由用逗号分隔的两个模式组成,格式为begpat, endpat.它用于匹配连续输入记录的范围。第一个模式begpat控制范围的开始位置,同时endpat控制模式的结束位置。计数器c会递增并在每条匹配的行上进行检查/BEGIN_CERTIFICATE/

答案2

您可以使用 收集保留空间中的所有证书,而不是直接写入文件H,然后在最后一行($!d停止处理除最后一行之外的所有行,因此此后的所有内容仅针对最后一行完成)移动保留空间到模式空间g并在写入之前删除要删除的内容:

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

答案3

如果我们在 blah2 之后找不到 END,则使用另一个 sed

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

相关内容