简体   繁体   English

Powershell在多行中提取多次出现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM