Powershell — Удаляет строки, начинающиеся с нескольких строк

#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. Спасибо, Тео, я действительно ценю ваше время за то, что вы ответили на этот вопрос для меня, он отлично сработал.