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

xpszyzbs  于 2022-12-18  发布在  Shell
关注(0)|答案(3)|浏览(207)

我想把一个文本文件拆分成几个文件,方法是用一个特定的字符串来确定每个文件的开头和结尾。第一个文件的开头可以用"<ca>"行来标识,结尾可以用"</ca>"行来标识。现在我想把这两个字符串之间的内容剪切并粘贴到一个新的文本文件中。到目前为止,我已经编写了以下代码:

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

第二个“if”用于从创建的文件中删除“标识字符串”。
我遇到了两个问题:

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

该文件是一个VPN配置,如下所示:

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>

输出如下所示:

clientdev tunproto udpremote 448verify-x509-name<ca>Certificate:...


(and等等)

7rtdyuoh

7rtdyuoh1#

你最好用多行正则表达式来做这件事。

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

确保在像这样使用Regex时使用-Raw

gojuced7

gojuced72#

将文件作为单个字符串读取,并使用正则表达式匹配来提取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将文件内容作为单个字符串获取。

8xiog9wr

8xiog9wr3#

一个在Powershell上按搜索字符串拆分文件的行。

按内容字符串拆分文件,在Powershell中运行:

$i=0;(gc Testfile.txt -raw) -split '#'|%{$i++;sc Testfile$i.txt -value $_}
本例将Testfile.txt拆分为多个文件,每个文件的编号递增,如Testfile1.txt、Testfile2.txt等,只要在原始文件中找到字符串“#”,“#”-也会在此过程中删除。
非常有用,我发现它在互联网上,并决定分享它.

相关问题