我有一个像这样的 SSL 证书链
-----BEGIN CERTIFICATE-----
MIICPjCCAeSgAwIBAgIRALMMpKnhRM2C7mnKI/rl8ggwCgYIKoZIzj0EAwIwgY4x
CERT1
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDIjCCAsegAwIBAgIOAMjnPM1wShDmOWUELuIwCgYIKoZIzj0EAwIwgagxCzAJ
CERT2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDIDCCAsWgAwIBAgIOAMjnPL8JUbVSmpMadWUwCgYIKoZIzj0EAwIwbDELMAkG
CERT3
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDBjCCAqygAwIBAgIFFRCCEwYwCgYIKoZIzj0EAwIwgZQxFDASBgNVBAoMC0Ft
CERT4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDNjCCAtugAwIBAgIJAKpBxYNyH8biMAoGCCqGSM49BAMCMIGUMRQwEgYDVQQK
CERT5
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
我需要从中删除最后一个证书。
在 MacOS/BSD 命令上split有-p按模式分割的标志,我使用了它:
cat cert | split -p "-----BEGIN CERTIFICATE-----"
cat xa{a,b,c,d}
Run Code Online (Sandbox Code Playgroud)
我相信在 Linux 上也有一个命令可以在一行中完成此操作,但在 Ubuntu 上该命令split无法按模式分割。
我需要使用标准 Linux 命令来完成这项工作,例如我标记的命令。
这个 GNU Sed 解决方案应该足够了:
\nsed -zE \'s/(.*\\n)-----BEGIN CERTIFICATE-----.*/\\1/\' your_input\nRun Code Online (Sandbox Code Playgroud)\n-E允许人们使用(\xe2\x80\xa6)而不是\\(\xe2\x80\xa6\\)捕获某物;-z(在 GNU Sed 中可用)是将整个输入视为带有嵌入\\ns 的单个长字符串。因此,第一个.*匹配尽可能多(并捕获它以及\\n它后面的内容,因此它可以在替换中使用 引用它\\1),只要它后面跟着它\\n-----BEGIN CERTIFICATE-----以及它后面的任何其他内容(第二个.*) 。