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