基于字符串的拆分文本文件

时间:2017-10-25 11:40:38

标签: string powershell text split

我希望通过按特定字符串确定每个文件的开头和结尾,将文本文件拆分为多个文件。 第一个文件的开头可以通过行idx = mask.argmax(1) idx[~mask[np.arange(len(idx)), idx]] = 0 # or invalid_val 标识,结尾可以通过"<ca>"标识。现在我想在新文本文件中剪切并粘贴这两个字符串之间的内容。 到现在为止,我已经写了这段代码:

"</ca>"

第二个&#34; if&#34;应该删除&#34;标识字符串&#34;来自创建的文件。

我遇到了两个问题:

  • 我只能选择文字的结尾
  • 源文件中的所有段落都不再存在,新文件只包含一行,其中包含所有内容

该文件是VPN-Configuration,如下所示:

$content = Get-Content .\*.txt
{
    if ($f -eq "</ca>") { $c > .\file.txt; }
    if ($f -ne "<ca>" -and $f -ne "</ca>") { $c += $f }
}

输出如下:

client
dev tun
proto udp
remote 448
verify-x509-name
<ca>
Certificate:
Data:
    Version: 3 (0x2)
    Signature Algorithm: md5WithRSAEncryption
    Issuer: C=de
    -----BEGIN CERTIFICATE-----
MIICzDCCAjWgAwIBAgIJANfh65DfDF45GFSD
    -----END CERTIFICATE-----
</ca>
<cert>  
Certificate:
    Data:
        Version: 3 (0x2)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=de
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
AoGBAN/jBWwRnjNtxJ+bj3U5oKhYjfu33N2dGlM9x5un9YLm9k6pBzhvG
</key>

(依此类推)

2 个答案:

答案 0 :(得分:1)

使用多行正则表达式进行此操作会更好。

Get-Content .\vpnconfig.txt -Raw | Select-String '(?sm)<ca>(.+)</ca>' | Select -Expand Matches | Select -First 1 -Expand Value

确保在使用此类正则表达式时使用-Raw

答案 1 :(得分:0)

将文件作为单个字符串读取,并使用正则表达式匹配来提取CA证书:

$config = Get-Content 'C:\path\to\your.ovpn' -Raw

if ($config -match '(?ms)<ca>(.*?)</ca>') {
    $matches[1].Trim() | Set-Content 'ca.crt'
} else {
    'No CA certificate found.'
}

在PowerShell v3之前,使用Get-Content | Out-String将文件内容作为单个字符串。