文字列のペアの最初の出現間のテキストを印刷するにはどうすればよいでしょうか?

文字列のペアの最初の出現間のテキストを印刷するにはどうすればよいでしょうか?

2 つのデジタル証明書を保持するファイルの一部をフィルタリングしようとしています。基本的に、必要なのは最初の部分 (Cert1 とします) であり、2 番目の部分 (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'

しかし、何らかの理由で、2番目のBEGINと2番目の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

関連情報