Regex multi-line работает в regexr, но не в PowerShell - PullRequest
0 голосов
/ 08 января 2019

У меня есть запрос на регулярное выражение в regexr, но он не будет работать для меня в PowerShell. Что я делаю не так?

регулярное выражение

(Host.*[\r\n]+([^\r\n]*)+[\r\n]+([^\r\n]*))

Данные

HostName: ComputerName
Date: 2018-12-21
Time: 09:16:02
Step: 01
Date: 2018-12-21
Time: 09:29:18
Step: 02
Date: 2018-12-21
Time: 09:47:38
Step: 03
Date: 2018-12-21
Time: 10:08:43
Step: 04
Date: 2018-12-21
Time: 10:27:00
Step: 05
Date: 2018-12-21
Time: 10:45:14
Step: 06
Date: 2018-12-26
Time: 10:02:39

При совпадении он захватывает остальную часть строки и следующие две строки. Так как все в группах по 3 на запись в журнале.

Я вставил рабочий код в powershell и попытался тремя способами.

$data | select-string -match "(Host.*[\r\n]+([^\r\n]*)+[\r\n]+([^\r\n]*))"

$data -matches "(Host.*[\r\n]+([^\r\n]*)+[\r\n]+([^\r\n]*))"

Я провел исследование, и самое близкое, что я могу получить, это то, что Windows не очень хорошо работает с \r\n.

Я еще не нашел решения.

Что я делаю не так или что мне нужно заменить \r\n на?

1 Ответ

0 голосов
/ 08 января 2019

Ваши данные не соответствуют вашим ожиданиям. Get-Content считывает файлы в массив строк и удаляет разрывы строк в конце каждой строки. И Select-String, и -match проверяют каждую строку отдельно от регулярного выражения, но не могут найти совпадения, потому что каждая строка содержит только часть того, что вы хотите сопоставить.

Чтобы решить эту проблему, вам нужно все содержимое файла в виде одной строки.

$data = Get-Content 'C:\path\to\input.txt' | Out-String

В PowerShell v3 или новее вы также можете использовать

$data = Get-Content 'C:\path\to\input.txt' -Raw
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...