powershell替换两行之间的文本

powershell替换两行之间的文本,powershell,replace,lines,between,Powershell,Replace,Lines,Between,我有一个文本文件,想替换两行之间的文本。在两行之间没有文本之前,此操作正常 我的代码: $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 文本文件: 有效的文本文件

我有一个文本文件,想替换两行之间的文本。在两行之间没有文本之前,此操作正常

我的代码:

$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行


我做错了什么?

更正了这里的正则表达式,只捕获第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

您的问题是正则表达式(简称RegEx)不允许第3行和第4行之间的任何内容。以下是您正在使用的内容(稍微清理):

让我们把它分解一下
(?m)
将正则表达式引擎置于多行模式,因此它允许您使用克拉
^
来指示行的开头,而不仅仅是字符串的开头。它还有其他功能,但这就是你使用它的目的。我放弃了
(.*)
,因为它毫无意义。因此,您有一克拉表示一行的开头,后面是文本
第3行
,然后是
[\r\n]+
,它将找到该行的结尾。然后它找到第4行,紧接着是该行的末尾。这就是为什么当有文本时它会失败,因为您不允许任何附加文本。为此,您可以使用
*?
。这意味着:点表示任何字符,不管它是字母、数字、符号,甚至是屏幕上没有注册的字符。星号
*
表示需要零个或多个字符,因此任何字符都需要零个或多个。问号告诉它查找零个或多个字符,但在模式中继续之前要匹配尽可能少的字符,因此它只会匹配内容,直到可以继续到
第4行[\r\n]
。功能模式将是:

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

请在脚本运行后显示您希望从每个文件中看到的内容。我希望结果是这样的:第1行第2行换行符和一些文本第5行6@TheIncorrigible1你能解释一下吗?我是个新手…@TheIncorrigible1不,
-raw
不会去掉新行字符,它只是将文件作为多行字符串读入。运行
(gc$file-raw)-match'\r'
,您可以看到它将找到回车字符,您可以使用
'\n'
运行它,查看它是否也找到新行字符。我也不确定他用的是什么错误的转义,他用的是一个有效的正则表达式。。。马虎,但有效,这解释了为什么他没有得到他想要的结果,因为他的正则表达式不允许它。@TheMadTechnician
忽略换行符,并在一个字符串中返回文件的全部内容。
我想我误解了帮助文本的意思。
`r`n
不是正确的转义吗?谢谢!我刚刚添加了(?ms),所以它将替换多行。将以捕获块结尾的行包装起来的目的是什么?这不是只抓住了其中一个吗?如果两者都有会发生什么?那不是失败了吗?或者
获取内容-Raw
是否只返回单个字符串中的换行,而不是Windows
\r\n
?@不可更正1我没有在捕获中包装任何内容
()
,我使用方括号指示它应该匹配任何字符,因此
[\r\n]
将匹配
\r
\n
,我使用
+
表示它需要一个或多个。我相信
-raw
会返回任何编码到文件中的内容。术语错误,但你明白我的意思。除了第一个语法(
[\r\n]+
)之外,您不会使用该语法,因此我假设如果确实是这样,则以下两个语法集将失败\r\nendings@TheIncorrigible1哦对不起,我刚才明白了。不,这一切正常。它至少查找
\r
\n
中的一个,我们并不真正关心哪一个,它只是确保
第4行
在它自己的行中,并且不包含在第3行和第4行之间的文本中。我想这是不一致的,我可以很容易地在它们后面添加一个
+
,就像我第一次添加一样,但这真的没有任何区别。
(?m)^Line 3[\r\n]+.*?[\r\n]Line 4[\r\n]