我有一个证书文件,其中有 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