【问题标题】:RegEx: Get multiline LDAP entry正则表达式:获取多行 LDAP 条目
【发布时间】:2021-09-29 03:45:40
【问题描述】:

我正在尝试捕获从 dn:.+ 到条目最后一行的整个 LDAP 条目,但在下一个条目之前的最后一行停止,例如,\n#entry-id: 8266。我使用 @987654322 的试验和错误@绝对无处可去。注意:我正在使用数据所在的导出 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

【问题讨论】:

  • LDAP 条目没有行。因此,不存在多行 LDAP 条目之类的东西。您实际上在谈论的是 LDAP 条目的 LDIF 表示。但是您提供的示例在逻辑上只包含一行,因为行终止符转义反斜杠。

标签: regex grep ldap


【解决方案1】:

使用您展示的示例,请尝试关注awk 代码。

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

如果您只想在entry-id: 之前从dn: 打印一组,请尝试以下代码:

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

【讨论】:

    【解决方案2】:

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

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

    Awk demo

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        相关资源
        最近更新 更多