gpt4 book ai didi

.net - Powershell:从LDIF文件中提取模式之间的值

转载 作者:行者123 更新时间:2023-12-03 00:56:58 26 4
gpt4 key购买 nike

我正在处理正则表达式,我的任务是编写一个脚本以提取LDIF上的搜索模式之间的特定文本,并且遇到了一些问题。我们的LDIF为OpenLDAP格式,因此我们的文件为

dn: cn=user1,ou=department,o=company,c=root
changetype: add
givenName: Givenname1
sn: SN1
Country: Cn1
userCertificate;binary:: lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3
City: City1

dn: cn=user3,ou=department3,o=company,c=root
changetype: add
givenName: Givenname3
sn: SN3
customdn: cn=user3,ou=department3,o=company,c=root
userCertificate;binary:: lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3
Country: Cn3
City: City3

dn: cn=user2,ou=department,o=company,c=root
changetype: add
givenName: Givenname2
sn: SN2
customdn: cn=user2,ou=department,o=company,c=root
userCertificate;binary:: lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3lowhjsefnasdvonidfb8943th54ebghyLHFUn9894y9bKalkbjsf
89ehgvpnoLNGPOVNnl;aiorgpnsg;n\vbubGB*gpbeoabgpiobrgaragop08hgnaoergn9r0agnh
U0hBMjU2MB4XDTE5MDYwNTA3
Country: Cn1
City: City1

文件行由换行符(CRLF)分隔。因此,我尝试使用以下模式仅提取User3的文本,这似乎给了我空白文件。
$RegexPattern = "`r`ndn: cn=User3(.*?)`r`n`r`n"
$result = [regex]::match($inputfile,$RegexPattern).Groups[1].Value

如果将捕获模式从更改为(。*),则从第一个匹配项之后获取所有文本。可以肯定的是,我丢失了一些东西,但是看不到我丢失了什么。有人可以帮忙吗?

编辑:也添加有关自定义DN的一些其他信息。在dn:的搜索字符串中包括CRLF的原因是,在用户对象上还有一个自定义DN,它是dn属性的副本,以实现向后兼容。我已经使用该属性更新了上面的示例LDIF条目。
编辑2:Wiktor的正则表达式几乎可以起作用,直到代码偶然发现userCertificate属性为止,该属性仅用LF而不是在其他地方看到的CR + LF来分割多个属性。

最佳答案

首先,请确保将整个文件读入一个变量:

$inputfile = Get-Content .\input.ldif -Raw

然后,您需要一个正则表达式
$RegexPattern = '(?mi)^dn: cn=User3[^\r\n]*(?:\r?\n[^\r\n]+)*'
$result = [regex]::match($inputfile,$RegexPattern).Value

regex demo

详细信息
  • (?mi)-区分大小写的匹配为ON并且多行行为也为ON
  • ^-一行
  • 的开始
  • dn: cn=User3-文字文本
  • [^\r\n]*-0和CR和LF以外的字符
  • (?:\r?\n[^\r\n]+)*-0+次出现CRLF / LF,然后出现1+个字符(CR和LF除外)(因此,上述字符串下方的任何非空行)。
  • 关于.net - Powershell:从LDIF文件中提取模式之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61729197/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com