我有一个文本文件,想要替换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行
我做错了什么?
答案 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]