【问题标题】:Replacing a text at specified line number of a file using powershell使用powershell替换文件指定行号的文本
【发布时间】:2011-05-18 06:43:03
【问题描述】:

如果有一个文件,例如 test.config ,该文件在第 140 行和第 170 行之间包含工作“WARN”,还有其他行中有“WARN”字样,但我想在第 140 行之间替换“WARN”和 170 带有单词“DEBUG”,并保持文件的其余文本相同,并且在保存时,“WARN”仅在第 140 行和第 170 行之间替换为“DEBUG”。其余所有文本不受影响。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    2 行:

    $FileContent = Get-Content "C:\Some\Path\textfile.txt"
    $FileContent | % { If ($_.ReadCount -ge 140 -and $_.ReadCount -le 170) {$_ -Replace "WARN","DEBUG"} Else {$_} } | Set-Content -Path "C:\Some\Path\textfile.txt"
    

    说明:

    • 将文本文件的内容写入数组“$FileContent”
    • 管道 $FileContent 数组到 For-EachObject cmdlet "%"
      • 对于数组中的每个项目,检查行号 ($_.ReadCount)
      • 如果行号为 140-170,则将 WARN 替换为 DEBUG;否则写入未修改的行。
      • 注意:您必须添加“Else {$_}”。否则,文本文件将只包含修改后的行。
      • Set-Content 将内容写入文本文件

    【讨论】:

    • 请在您的回答中添加一个简短的解释。
    • 描述部分提供的解释
    【解决方案2】:

    看看$_.ReadCount 会有所帮助。举个例子,我只替换第 10-15 行。

    $content = Get-Content c:\test.txt
    $content | 
      ForEach-Object { 
        if ($_.ReadCount -ge 10 -and $_.ReadCount -le 15) { 
          $_ -replace '\w+','replaced' 
        } else { 
          $_ 
        } 
      } | 
      Set-Content c:\test.txt
    

    之后,文件将包含:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    replaced
    replaced
    replaced
    replaced
    replaced
    replaced
    16
    17
    18
    19
    20
    

    【讨论】:

    • 有趣的提示,我不知道这个。
    • 我想我首先在@ShayLevy 的一些评论/帖子/推文中看到了这一点。
    • Stej 你的回答很完美,这正是我所需要的
    • @Janki,很高兴早上听到这个消息 :) 如果可行,您可以接受答案。
    【解决方案3】:

    使用数组切片:

    $content = 获取内容 c:\test.txt

    $out = @()
    $out += $content[0..139]
    $out += $content[140..168]  -replace "warn","DEBUG"
    $out += $content[169..($content.count -1)]
    $out | out-file out.txt
    

    【讨论】:

      【解决方案4】:

      这是测试文件

      text
      text
      DEBUG
      
      DEBUG
      
      
      TEXT
      

      --

      PS:\ gc .\stuff1.txt |% { [system.text.regularexpressions.regex]::replace($_,"WARN","DEBUG") }  > out.txt
      

      Out.txt 是这样的

      文本 文本 调试

      调试

      文字

      【讨论】:

        【解决方案5】:

        可能是微不足道的,但它可以完成工作:

        $content = gc "D:\posh\stack\test.txt" $开始=139 $结束=169 $内容 | % {$i=0;$lines=@();}{ if($i -ge $start -and $i -le $end){ $lines+=$_ -replace 'WARN', 'DEBUG' } 别的 { $行+=$_ } $i+=1 }{设置内容 test_output.txt $lines}

        【讨论】:

          【解决方案6】:

          所以我的脚本非常相似,所以我将发布我最终做了什么。

          我有一堆服务器,它们都在同一个位置使用相同的脚本,我需要更新所有脚本中的路径。

          我刚刚替换了整行(此脚本中的第 3 行)并将脚本重写了出来

          我的服务器名称和替换旧路径的“路径”存储在一个数组中(如果你想更自动化,你可以从数据库中提取它:

          $servers = @("Server1","Server2")
          $Paths = @("\\NASSHARE\SERVER1\Databackups","\\NASSHARE\SERVER2\Databackups")
          $a = 0
          
          foreach ($x in $servers)
          {
          $dest = "\\" + $x + "\e$\Powershell\Backup.ps1"
          $newline = '$backupNASPath = "' + $Paths[$a] + '"'
          $lines = @(Get-Content $dest)
          $lines[3] = $newline
          $lines > $dest
          $a++
          }
          

          它有效,并为我节省了大量登录每个服务器和更新每个路径的时间。呃

          干杯

          【讨论】:

            猜你喜欢
            • 2019-03-02
            • 1970-01-01
            • 2021-01-12
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多