匹配后删除行,直到出现空行

Remove lines after match, until blank line occurs

我有一个 ldif 文件,正在检索匹配的行,以及后面的行,直到到达空白行。这很好用。

$ awk '/dn:\ cn=test/,/pattern|^$/' $file
dn: cn=test,cn=Users,dc=test,dc=com
cn: John
sn: Smith
givenname: Test
mail: test@test.com
userpassword: password
uid: test
defaultgroup: cn=test,cn=test01,cn=groups,dc=test,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetorgperson
objectclass: user
objectclass: user2

我想知道的是,我怎样才能从文件中删除这些行?

要从输入文件中删除这些行,您可以使用 ! 取反范围,因此只打印其他行:

awk '!(/dn:\ cn=test/,/pattern|^$/)' "$file" > tmp && mv tmp "$file"

输出重定向到临时文件,然后覆盖原始文件。