【问题标题】:Replacing lines between two specific strings - sed equivalent in cmd替换两个特定字符串之间的行 - cmd 中的 sed 等效项
【发布时间】:2018-10-30 21:59:39
【问题描述】:

我想替换两个字符串[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 如果没有办法做一批)。

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

【问题讨论】:

    标签: cygwin cmd powershell cmd cygwin text-processing


    【解决方案1】:

    使用 PowerShell,从 Windows 7 开始。

    ## 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"
    

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

    【讨论】:

    • 这是powershell,对吧? (我会在答案的顶部提到它,只是为了它)干杯。
    【解决方案2】:
    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"
    

    所以你可以使用你的正则表达式。

    【讨论】:

    • 如何替换关键字/模式之间的句子?
    • 同 SED 一样。 Global 属性表示对整个文件进行处理。使用你的模式。所以我可以测试它并确保它工作我将 CRCRLF 添加到 Windows 文本文件的行尾,或者将 LF 转换为 Unix 文件的 CRLF(你也问过这个问题)。这称为示例代码。
    猜你喜欢
    • 2021-07-23
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多