我正在尝试过滤包含 2 个数字证书的文件的一部分。基本上,我想要第一部分(比如说 Cert1)而不是第二部分(Cert2)。
该文件的内容是:
-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAA
AAAA
ETC
-----END CERTIFICATE-----
我的印象是这会给我 Cert1 的内容(第一个 BEGIN 和第一个 END 之间的第一部分):
cat /etc/nginx/cert.pem | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
但出于某种原因,它仍然向我显示第二个 BEGIN 和第二个 END 之间的所有内容(基本上没有任何变化;所有内容都是一样的)。
有什么指点吗?
答案1
你就快到了:
sed -ne '
/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p # got the range, ok
/-END CERTIFICATE-/q # bailing out soon as the cert end seen
' /etc/nginx/cert.pem
但请注意,证书开始和结束标记行也是输出的一部分。
答案2
您可以使用以下 sed 命令来完成此任务
sed '/-----END CERTIFICATE-----/q' /etc/nginx/cert.pem
q
是指示 sed 退出的退出代码。因此 sed 将从文件开头打印并在遇到模式“-----END CERTIFICATE-----”时退出。这会导致它在第一个证书末尾停止。
也不需要使用管道将 cat 的输出重定向到 sed。只需在 sed 命令中指定文件名即可。
来源 -http://www.theunixschool.com/2011/09/sed-selective-printing.html