我正在处理正则表达式,我的任务是编写一个脚本以提取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/