
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