我想替换两个字符串[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!!!
我在cygwin中使用了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
,所以我想知道cmd(或{{1})中是否有办法}(如果无法进行批处理)。
最终,我想在多个文件上运行此文件,并将它们的这一部分(在上述两个词之间)更改为我提供的文本。
答案 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。