如何获取如下所示的 .PEM 内容:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK
XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx
mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe
jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ
HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW
qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO
wwIDAQAB
-----END PUBLIC KEY-----
使其看起来像这样一行:
"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"
我可以使用以下命令删除开始和结束行:
$File = "C:\pathto\some.pem"
$content = Get-Content $file
$contents = $content
$Complete = [regex]::split($contents, "-----BEGIN PUBLIC KEY-----(.*?)-----END PUBLIC KEY-----")
for($i = 1; $i -lt $Complete.Length; $i =$i+2){
$Complete[$i] -replace " ","`r`n"
}
首先,一些注意事项:
如评论中所述,预期输出中的引号似乎不匹配 - 您在字符串的开头有一个引号 (
"k=rsa
),该引号由第一个 p 值末尾的引号 ( p=MIIB...VudK"
)。我不确定这是否是一个拼写错误,或者这是否是预期的输出,所以我将按其表面价值并假设它是预期的输出。如果这是一个拼写错误,您可能需要稍微调整一下这个答案。
问题中 PEM data 的最后一行是
wwIDAQAB
但您的示例输出以 "bwIDAQAB"
结尾 - 一个以 w
开头,另一个以 b
开头 - 我假设这是一个拼写错误,我将使用以 b
开头的值来匹配预期的输出。
Get-Content
返回一个 array 字符串,相当于:
$content = @(
"-----BEGIN PUBLIC KEY-----",
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK",
"XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx",
"mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe",
"jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ",
"HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW",
"qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO",
"bwIDAQAB",
"-----END PUBLIC KEY-----"
);
(请注意,我已将最后一个数据行更改为
bwIDAQAB
以匹配您的预期输出)。
为了完整起见,这是您的预期输出:
$expected = '"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"'
如果您使用的是 PowerShell 7,您可以执行以下操作:
$complete = @(
"`"k=rsa; p=",
($content[1..($content.Length - 2)] -join "`" `""),
"`""
) -join ""
$complete -eq $expected
# True
基本上:
"k=rsa; p=
前缀" "
分隔符连接剩余的行"
后缀给予:
"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"
如果您使用的是 PowerShell 5.1,范围运算符 (
..
) 不可用,但您可以这样做:
$complete = @(
"`"k=rsa; p=",
(($content | select-object -Skip 1 -First ($content.Length - 2)) -join "`" `""),
"`""
) -join ""
$complete -eq $expected
# True
这是做同样事情的稍微冗长的方式。