Как напечатать текст между первым вхождением пары строк?

Как напечатать текст между первым вхождением пары строк?

Я пытаюсь отфильтровать часть файла, которая содержит 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

Связанный контент