powershell替换2行

时间:2018-02-08 19:37:08

标签: powershell replace lines between

我有一个文本文件,想要替换2行之间的文本。这工作正常,直到两行之间没有文本。

我的代码:

$File = "D:\test.txt" 
$NewLine = "newline with some text"
$text = Get-Content "D:\test.txt" -raw

$text -replace ('(?m)(.*)^Line 3[\r\n]+Line 4([\r\n])', $NewLine) | 
  Out-File $File -Force

文本文件:

可行的文本文件:

  

第1行   第2行   3号线   第4行   5号线   第6行

不起作用的文本文件:

  

第1行   第2行   3号线   这里有一些文字
  第4行   5号线   第6行

我做错了什么?

2 个答案:

答案 0 :(得分:0)

在此处更正了您的正则表达式,仅捕获第3行和第4行,其中包含文本。

$File = 'D:\test.txt'
$NewLine = 'newline with some text'
$text = Get-Content -Path 'D:\test.txt' -Raw

$Pattern = '(?m)^Line\s3[\r\n]+.*?Line\s4'

$text -replace $Pattern,$NewLine | 
  Out-File -FilePath $File -Force

答案 1 :(得分:0)

你遇到的问题是你的正则表达式(简称RegEx)不允许第3行和第4行之间的任何内容。这就是你正在使用的东西(清理了一点点):

(?m)^Line 3[\r\n]+Line 4[\r\n]

让我们稍微打破一下。 (?m)将RegEx引擎置于多行模式,因此它允许您使用克拉^来指示行的开头,而不仅仅是字符串的开头。它还有其他功能,但这就是你用它的原因。我放弃了(.*),因为它毫无意义。所以你有一个克拉表示一行的开头,然后是文本Line 3,然后是[\r\n]+,它将找到该行的结尾。然后它找到Line 4,紧接着是该行的结尾。这就是为什么它在有文本时失败,你不允许任何其他文本。为此,您可以使用.*?。这意味着:点表示任何字符,无论是字母,数字,符号,还是未在屏幕上注册的字符都无关紧要。星号*表示需要零个或多个,因此零个或多个字符。问号告诉它要查找零或更多,但要在模式中移动之前匹配尽可能少的字符,因此它只会匹配事物,直到它可以移动到Line 4[\r\n]。功能模式是:

(?m)^Line 3[\r\n]+.*?[\r\n]Line 4[\r\n]