替换两个特定字符串之间的行 - 在 cmd 中等效于 sed

Replacing lines between two specific strings - sed equivalent in cmd

我想替换两个字符串 [REPORT][TAGS] 之间的行。文件看起来像这样

Many lines 
many lines
they remain the same

[REPORT]

some text
some more text412

[TAGS]

text that I Want
to stay the same!!!

我在 :

中使用了 sed
sed -e '/[REPORT]/,/[TAGS]/c\[REPORT]\nmy text goes here\nAnd a new line down here\n[TAGS]' minput.txt > moutput.txt

这给了我这个:

Many lines 
many lines
they remain the same

[REPORT]
my text goes here
And a new line down here
[TAGS]

text that I Want
to stay the same!!!

当我这样做并在记事本中打开输出文件时,它没有显示新行。我假设这是因为格式问题,一个简单的 Dos2Unix 应该可以解决问题。

但正因为如此,也主要是因为并非我所有的同事都可以访问 cygwin 我想知道是否有办法在 (或 Powershell如果没有办法做一个批次)。

最终,我想 运行 对文件数量进行修改,并将其中的这一部分(在上述两个词之间)更改为我提供的文本。

使用 PowerShell,从 Windows 7 日开始。

## Q:\Test18\SO_53073481.ps1
## defining variable with a here string
$Text = @"
Many lines 
many lines
they remain the same

[REPORT]

some text
some more text412

[TAGS]

text that I Want
to stay the same!!!
"@

$Text -Replace "(?sm)(?<=^\[REPORT\]`r?`n).*?(?=`r?`n\[TAGS\])",
               "`nmy text goes here`nAnd a new line down here`n"

-replace 正则表达式使用非消耗 lookarounds

示例输出:

Many lines
many lines
they remain the same

[REPORT]

my text goes here
And a new line down here

[TAGS]

text that I Want
to stay the same!!!

要从文件中读取文本,替换并写回(即使不存储在 var 中),您可以使用:

(Get-Content ".\file.txt" -Raw) -Replace "(?sm)(?<=^\[REPORT\]`r?`n).*?(?=`r?`n\[TAGS\])",
               "`nmy text goes here`nAnd a new line down here`n"|
Set-Content ".\file.txt"

要在一个管道中重复使用相同的文件名,括号是必需的。

Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set regEx = New RegExp
regEx.Pattern = "\n"
regEx.IgnoreCase = True 
regEx.Global = True
Outp.Write regEx.Replace(Inp.ReadAll, vbcrlf)   

使用

cscript //nologo "C:\Folder\Replace.vbs" < "C:\Windows\Win.ini" > "%userprofile%\Desktop\Test.txt"

所以你可以使用你的 RegEx。