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

时间:2018-10-30 21:59:39

标签: powershell cmd cygwin text-processing

我想替换两个字符串[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,所以我想知道(或{{1})中是否有办法}(如果无法进行批处理)。

最终,我想在多个文件上运行此文件,并将它们的这一部分(在上述两个词之间)更改为我提供的文本。

2 个答案:

答案 0 :(得分:5)

使用从Windows 7开始提供的PowerShell。

## Q:\Test\2018\10\30\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"

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

答案 1 :(得分:0)

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。