Powershell, регулярное выражение, разделяйте текст двоеточием, но не учитывайте букву диска и дату/время

#regex #powershell

Вопрос:

Регулярное выражение для меня закрытая книга, я его (пока) не понимаю. Я все еще знакомлюсь с этим предметом. Тем не менее, я хочу закончить сценарий до окончания срока действия моего контракта.

У меня есть это сообщение:

 E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:107:time=08/10/2021 20:38:24
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:108:sw!version=3.2.1.0 ()
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:109:os_text_encoding=cp1250
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:110:!snapshot?!=unset
 

Я хочу разделить это на три части.

Первая часть: все, что было до строки № 105, например E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log

Вторая часть: номер строки, например 105

Последняя часть: все после строки № 105, например time=08/10/2021 20:38:24

На первый взгляд я бы использовал двоеточие в качестве разделителя, но я хочу сохранить букву диска E:, также время 20:38:24 будет разделено. Моей второй мыслью было отделить номер строки, так что»: 105:». Но номер строки может варьироваться, однозначный, двузначный … и мне нужен сам номер строки. Другой момент, расширение файла». log » может измениться или отсутствовать.

Не могли бы вы дать мне подсказку?

Ответ №1:

Это может сделать это регулярное выражение:

Регулярное выражение ( (.*:\[^:]*):([0-9]*):(.*) ) просмотрит (3) элементов и сопоставит каждому из них:

  1. (.*:\[^:]*): это соответствует вашему пути, включающему : , заканчивающемуся :
  2. ([0-9]*): это соответствует номеру строки, заканчивающемуся на :
  3. (.*) это соответствовало остальной части строки

Ответ №2:

Регулярное выражение, которое вы можете использовать (.*?):([0-9] ):(.*)

 $text = @'
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:107:time=08/10/2021 20:38:24
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:108:sw!version=3.2.1.0 ()
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:109:os_text_encoding=cp1250
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log:110:!snapshot?!=unset
'@ -split 'r?n'

$pattern = '(.*?):([0-9] ):(.*)'

$text | Where-Object { $_ -match $pattern } | ForEach-Object {
    [PSCustomObject]@{
        Path   = $Matches[1]
        LineNo = $Matches[2]
        Line   = $Matches[3]
    }
}
 

Выход

 Path                                                                     LineNo Line
----                                                                     ------ ----
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log 107    time=08/10/2021 20:38:24
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log 108    sw!version=3.2.1.0 ()   
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log 109    os_text_encoding=cp1250 
E:migrationls_da_itm_open_CLASS_Server_20211008_194217_305_session.log 110    !snapshot?!=unset