如何打印第一次出现的一对字符串之间的文本?

如何打印第一次出现的一对字符串之间的文本?

我正在尝试过滤包含 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

相关内容