Как я могу сопоставить точный шаблон с sed -n - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть файл test.txt

---
kind: ClusterRole
metadata:
kind: ClusterRoleBinding
metadata:
subjects:
roleRef:
  kind: ClusterRole
  name: bla

И мне нужен этот вывод с помощью sed (только строка, которая соответствует точному шаблону)

kind: ClusterRole
metadata:

sed -n '/ kind : ClusterRole /, / metadata / p 'test.txt

kind: ClusterRole
metadata:
kind: ClusterRoleBinding
metadata:
  kind: ClusterRole
  name: bla

показывает ClusterRole, ClusterRoleBinding и дополнительный отступ ClusterRole

sed -n '/kind: ClusterRole\b/,/metadata/p' test.txt
sed -n '/\<kind: ClusterRole\>/,/metadata/p' test.txt

Оба вышеприведенных вывода ни к чему, что я делаю неправильно? просто так понятно, и я не получаю никаких предложений grep -B 2 ;-) это пример файла, оригинальный файл намного больше и содержит сотни ClusterRoles, поэтому мне нужно выяснить, как соответствовать точному шаблону.

Спасибо!

lema

Ответы [ 3 ]

0 голосов
/ 16 февраля 2020

Вы должны включить в шаблон начало строки (^) и конец строки ($).

0 голосов
/ 16 февраля 2020

Это может работать для вас (GNU sed):

sed -n 'N;/^kind: ClusterRole\nmetadata:$/p;D' file

Добавить следующую строку и напечатать строки, если они совпадают. Удалите первую строку и повторите.

Если вы хотите только первое совпадение, используйте:

sed -n 'N;/^kind: ClusterRole\nmetadata:$/{p;q};D' file
0 голосов
/ 15 февраля 2020

Если вам просто нужно выполнить поиск по нескольким точкам, то вы можете добиться этого, используя pcregrep

pcregrep -M 'kind: ClusterRole(\n)metadata:' test.txt

, где -M, --multiline разрешают шаблонам совпадать с несколькими строками.

Более подробную информацию можно найти в этом SO сообщении.

Редактировать:

Вы также можете использовать grep

grep -Pazo 'kind: ClusterRole\nmetadata:' test.txt

Ссылка: это ТАК сообщение

...