如何将一个精确的模式与sed-n匹配

如何将一个精确的模式与sed-n匹配,sed,Sed,我有一个test.txt文件 --- kind: ClusterRole metadata: kind: ClusterRoleBinding metadata: subjects: roleRef: kind: ClusterRole name: bla 并且需要这个sed输出(只需要与确切模式匹配的行) sed-n'/kind:ClusterRole/,/metadata/p'test.txt kind: ClusterRole metadata: kind: ClusterRol

我有一个test.txt文件

---
kind: ClusterRole
metadata:
kind: ClusterRoleBinding
metadata:
subjects:
roleRef:
  kind: ClusterRole
  name: bla
并且需要这个sed输出(只需要与确切模式匹配的行)

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
sed-n'/kind:ClusterRole\b/,/metadata/p'test.txt
sed-n'/\/,/metadata/p'test.txt
以上两种输出均为零,我做错了什么? 很清楚,我没有收到任何grep-b2建议;-)这是一个示例文件,原始文件要大得多,有数百个ClusterRoles,因此我需要找出如何匹配确切的模式

谢谢大家!


lema

如果您只需要搜索精确的多行,那么您可以使用
pcregrep

pcregrep -M 'kind: ClusterRole(\n)metadata:' test.txt
grep -Pazo 'kind: ClusterRole\nmetadata:' test.txt
其中-M,-multiline允许模式匹配多行

更多细节可以在SO post中找到

编辑:

您也可以使用
grep

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

参考:所以发布后,您应该在模式中包括行的开头(
^
)和行的结尾(
$

这可能适合您(GNU-sed):

追加下一行并打印匹配的行。删除第一行并重复

如果只需要第一个匹配项,请使用:

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

不太清楚为什么要这样做(您不需要sed来生成所描述的输出)。但是:
sed-n'/^kind:ClusterRole$/,${1,/^metadata:$/p}file.txt
sed-n'/^kind:ClusterRole$/,${p;/^metadata:$/q}file.txt
以避免浪费时间读取文件的其余部分