按模式剥离文件的最后部分 - 从链中删除最后一个证书

kyb*_*kyb 3 awk sed ack

我有一个像这样的 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 命令来完成这项工作,例如我标记的命令。

Enr*_*lis 5

这个 GNU Sed 解决方案应该足够了:

\n
sed -zE \'s/(.*\\n)-----BEGIN CERTIFICATE-----.*/\\1/\' your_input\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • -E允许人们使用(\xe2\x80\xa6)而不是\\(\xe2\x80\xa6\\)捕获某物;
  • \n
  • -z(在 GNU Sed 中可用)是将整个输入视为带有嵌入\\ns 的单个长字符串。
  • \n
\n

因此,第一个.*匹配尽可能多(并捕获它以及\\n它后面的内容,因此它可以在替换中使用 引用它\\1),只要它后面跟着它\\n-----BEGIN CERTIFICATE-----以及它后面的任何其他内容(第二个.*) 。

\n