#powershell
Вопрос:
Я надеюсь, что кто-нибудь сможет мне помочь. Я извлек сертификаты из PFX и хотел бы удалить все строки, начинающиеся с пробела, «Атрибуты пакета», «эмитент» и «тема». Мой входной файл будет выглядеть примерно так:
Bag Attributes
friendlyName: BLAH BLAH
BLAH BLAH BLAH
subject=C = BLAH BLAH BLAH
issuer=C = BLAH BLAH BLAH
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
Bag Attributes
friendlyName: BLAH BLAH
BLAH BLAH BLAH
subject=C = BLAH BLAH BLAH
issuer=C = BLAH BLAH BLAH
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
Bag Attributes
friendlyName: BLAH BLAH
BLAH BLAH BLAH
subject=C = BLAH BLAH BLAH
issuer=C = BLAH BLAH BLAH
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
И результат должен выглядеть следующим образом:
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
Я попытался использовать следующее, которое удаляет строки, начинающиеся с пробелов, однако мне не удалось успешно удалить строки, начинающиеся с «Атрибуты сумки»,»тема» и «эмитент» с { $_ -не соответствует «^ «,»^тема»,»^эмитент»,»^Атрибуты сумки» }
Get-Content "C:ScriptRepositoryCertsCA-Chain.pem" |
Where { $_ -notmatch "^ " } |
Set-Content "C:ScriptRepositoryCertsCA-chain2.pem"
Любая помощь будет очень признательна.
Комментарии:
1. Это стандартная операция регулярного выражения… Вам нужно прочитать файл с помощью get-content (или одного из альтерантивов .net), а затем строка за строкой проверить регулярное выражение и, если оно заполнено, удалить совпадение. Лично я предпочитаю операции регулярных выражений .net, но операции регулярных выражений powershell тоже должны быть в порядке
2. Привет, Фарбкрейс, спасибо за быстрый ответ, я пару дней бился головой об стену, пытаясь заставить это работать, не могли бы вы привести пример.
3.
BLAH BLAH BLAH
это плохое представление сертификата, в котором, согласно определению вашего вопроса, не должно быть пробелов. Итак, вопрос в том, чему вы хотите соответствовать ? (а не то, что вы не хотите сопоставлять). например, все допустимые символы сертификата (за исключением пробелов), которые начинаются от начала до конца строки:-Match '^[A-Z,a-z,0-9,=] $'
(или определенной длины-Match '^[A-Z,a-z,0-9,=]{8,40}$'
, или-Match '^[A-Z,a-z,0-9,=] s*$'
если вы хотите принять завершающие пробелы)4. Привет , Фарбкрейс, мое первое предложение в моем вопросе гласит: «удалите все строки, начинающиеся с пробела»,» Атрибуты сумки»,» эмитент «и» тема», что все, что требовалось.
Ответ №1:
Если у вас есть это в файле, просто используйте a switch
с очень простым регулярным выражением:
$result = switch -Regex -File 'X:InputFile.pfx' {
'^(Bag|subject|issuer|s)' { <# skip these lines #> }
default { $_ }
}
$result | Set-Content -Path "C:ScriptRepositoryCertsCA-chain2.pem"
Выход:
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BLAH BLAH BLAH
BLAH BLAH BLAH
-----END CERTIFICATE-----
Сведения о регулярном выражении:
^ Assert position at the beginning of the string
( Match the regular expression below and capture its match into backreference number 1
Match either the regular expression below (attempting the next alternative only if this one fails)
Bag Match the characters “Bag” literally
| Or match regular expression number 2 below (attempting the next alternative only if this one fails)
subject Match the characters “subject” literally
| Or match regular expression number 3 below (attempting the next alternative only if this one fails)
issuer Match the characters “issuer” literally
| Or match regular expression number 4 below (the entire group fails if this one fails to match)
s Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
)
Комментарии:
1. Спасибо, Тео, я действительно ценю ваше время за то, что вы ответили на этот вопрос для меня, он отлично сработал.