Regex多行可在regexr中运行,但不能在PowerShell中运行

时间:2019-01-08 15:29:04

标签: regex powershell

我有一个正则表达式查询在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 :(得分:1)

您的数据不是您所期望的。 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