Powershell正则表达式每行而不是整个字符串

时间:2015-04-07 14:02:28

标签: regex powershell

给定foo.txt

this is a file
it has some text
the text has three lines

以下正则表达式替换

(get-content -raw foo.txt) -replace ".*", "hello" | write-output

产生输出

hellohello
hellohello
hellohello

而不是所需的

hello

我的理解是get-content将内容作为字符串数组返回,每行一个。 -raw标志将内容作为单个字符串返回,从而取代了此行为。据我所知,".*"应匹配整个字符串,但它在每一行匹配两次。

请告知。

3 个答案:

答案 0 :(得分:2)

使用内联(?s) dotall )修饰符强制.跨越换行符。

(Get-Content .\foo.txt -Raw) -replace "(?s).+", "hello"

示例:

PS> $data = Get-Content .\foo.txt -Raw
PS> $data
this is a file
it has some text
the text has three lines
PS> $data -replace "(?s).+", "hello"
hello

答案 1 :(得分:1)

除了说.似乎不匹配换行符之外,我无法解释它,因此每个完整行匹配一个匹配,然后匹配每行末尾的零个字符。< / p>

这也解释了.+每行一次的hello行为。

您可以使用与换行符匹配的更好模式来“修复”此问题。

(Get-Content -raw .\foo.txt) -replace "(.|\r|\n)+", "hello"

答案 2 :(得分:0)

来自https://stackoverflow.com/a/13674250/1252649

  

DotAll模式的诀窍是使用[\s\S]而不是.。此角色类匹配任何角色......

当然,这提出了一个问题:.究竟应该与“任何角色”匹配。