[英]Powershell extract multiple occurrences in multi-lines
I have a text file that has thousands of binary certificates, this is a sample of it. 我有一个包含数千个二进制证书的文本文件,这是其中的一个示例。
Row 1:
Binary Certificate:
-----BEGIN CERTIFICATE-----
MIIFtzCCBJ+gAwIBAgIKGUNYAwAAAAAAODANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE-----
Row 2:
Binary Certificate:
-----BEGIN CERTIFICATE-----
MIIGEzCCBPugAwIBAgIKGVe6uwAAAAAAOTANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE-----
Row 3:
Binary Certificate:
-----BEGIN CERTIFICATE-----
MIIGMzCCBRugAwIBAgIKGYrkyAAAAAAAOjANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE
I need to output each certificate to a separate file. 我需要将每个证书输出到单独的文件。 What I'm struggling with is how to extract from "-----BEGIN CERTIFICATE-----" all the way to the first "-----END CERTIFICATE-----" to save it to a variable/file, then go and find the next match and so on. 我正在努力的是如何从“ ----- BEGIN CERTIFICATE -----”一直提取到第一个“ ----- END CERTIFICATE -----”,以将其保存到变量/文件,然后找到下一个匹配项,依此类推。
The output of each match should look like this: 每个匹配项的输出应如下所示:
-----BEGIN CERTIFICATE-----
MIIFtzCCBJ+gAwIBAgIKGUNYAwAAAAAAODANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE-----
I have tried multiple Regex's with no luck :[ 我已经尝试了多个Regex,但没有运气:[
Is there a way, whether Regex or String.Split that can do this match/split? 有没有办法(无论是正则表达式还是String.Split)都可以执行此匹配/拆分操作?
If the contents are exactly like you stated above then this should work on extracting the Key. 如果内容与您上面所述完全相同,则这应该可以提取密钥。
$File = "C:\Test.txt"
$content = Get-Content $file
$contents = $content
$Complete = [regex]::split($contents, "BEGIN CERTIFICATE-----(.*?)-----END CERTIFICATE")
for($i = 1; $i -lt $Complete.Length; $i =$i+2){
$Complete[$i] -replace " ","`r`n"
}
This script will read file sample.pem
and save each found certificate incrementing the number to cert#.pem
该脚本将读取文件sample.pem
并保存每个找到的证书,并将其编号递增到cert#.pem
## Q:\Test\2017\08\25\SO_45884754.ps1
$Pattern = '(?smi)^-{2,}BEGIN CERTIFICATE-{2,}.*?-{2,}END CERTIFICATE-{2,}'
Get-Content .\sample.PEM -raw |
Select-String -Pattern $Pattern -Allmatches|
ForEach-Object {$Cnt=0;$_.Matches}| ForEach-Object {
$Cnt++
Set-Content -Value $_.Value -Path ("Cert{0}.pem" -f $Cnt)
}
There may be several ways to this. 可能有几种方法。 PowerShell 5 has a new feature that can be used to detect patterns, for example. 例如,PowerShell 5具有一项新功能,可用于检测模式。 Anything is possible with regex, though it is always a bit cryptic. regex可以做任何事情,尽管它总是有点神秘。 If you wanted to do good ol' easy to read/understand script, you could do something like this: 如果您想做一个易于阅读/理解的脚本,则可以执行以下操作:
$begin_certificate='-----BEGIN CERTIFICATE'
$end_certificate ='-----END CERTIFICATE'
[System.Collections.ArrayList]$certs=@()
$add_next = $false
$all_certs = get-content C:\Temp\a.txt
Foreach ($line in $all_certs) {
if ( $line.StartsWith($begin_certificate)) {
$add_next = $true
$cert_content = $begin_certificate
continue
}
if ($add_next) {
$cert_content += "`n$line"
if ($line.StartsWith($end_certificate)) {
$add_next = $false
[void]$certs.add($cert_content) # don't print the result of operation
}
}
}
# This array list has all the certs now
$certs
With the file sample you have given above, you would get 3 items in certs and following as output: 使用上面提供的文件样本,您将获得3项证书,并作为输出:
-----BEGIN CERTIFICATE
MIIFtzCCBJ+gAwIBAgIKGUNYAwAAAAAAODANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE
MIIGEzCCBPugAwIBAgIKGVe6uwAAAAAAOTANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE
MIIGMzCCBRugAwIBAgIKGYrkyAAAAAAAOjANBgkqhkiG9w0BAQsFADBxMQswCQYD
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT
-----END CERTIFICATE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.