#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) элементов и сопоставит каждому из них:
(.*:\[^:]*):
это соответствует вашему пути, включающему:
, заканчивающемуся:
([0-9]*):
это соответствует номеру строки, заканчивающемуся на:
(.*)
это соответствовало остальной части строки
Ответ №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