正则表达式:获取多行 LDAP 条目

RegEx: Get multiline LDAP entry

我正在尝试捕获从 dn:.+ 到条目最后一行的整个 LDAP 条目,但在下一个条目之前的最后一行停止,例如 \n#entry-id: 8266。我的试用和使用 egrep 的错误绝对无处可去。注意:我正在使用数据所在的导出 ldif 文件,fwiw。

我最接近的是 egrep "dn: cn=name,ou=People,dc=example,dc=com.+.|\n*.+\n" 但终端没有输出。我已经在 regexr.com 上测试了实际的正则表达式。我知道这是一个完全不同的环境。

提前致谢!


示例数据:


dn: cn=name,ou=People,dc=example,dc=com \
shadowLastChange: 17492 \
userPassword: password \
sn: Last \
givenName: First \
cn: first \
mail: name@example.com \
displayName: First Last \
o: University \
ou: Dept. \
objectClass: top \
objectClass: person

\# entry-id: 8266

egrep 使用扩展正则表达式(相当于 grep -E)。更喜欢 grep -P (perl 正则表达式)。
-z 标志使您的正则表达式多行:

grep -Pz "dn(\n|.)*?(\n\n|$)"

这与 dn 后跟任意数量的字符(或换行符)匹配,直到(? 使前面的表达式变得懒惰而不是贪婪)下一次出现 \n\n 或文件结尾 ($)

如果数据的结构总是这样,并且可以选择使用 awk,则可以使用以 dn: 开头并以 entry-id: 结尾的 range,并且只打印行没有条目 ID:

awk '/^dn:/,/entry-id/ {
  if(!/entry-id:/){print}
}' file

Awk demo

使用您展示的示例,请尝试以下 awk 代码。

awk '/entry-id/{found=""} /^dn:/{found=1} found' Input_file

OR 如果您只想在 entry-id: 之前从 dn: 打印 1 套,请尝试以下操作代码:

awk '/entry-id/{exit} /^dn:/{found=1} found' Input_file