使用PowerShell替换文件的指定行号处的文本

时间:2011-05-18 06:43:03

标签: powershell

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

6 个答案:

答案 0 :(得分:6)

看看$_.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

答案 1 :(得分:2)

使用数组切片:

$ content = Get-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

答案 2 :(得分:2)

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 {$ _}”。否则,文本文件将仅包含修改的行。
    • 设置内容以将内容写入文本文件

答案 3 :(得分:0)

这是测试文件

text
text
DEBUG

DEBUG


TEXT

-

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

Out.txt看起来像这样

文本 文本 DEBUG

DEBUG

TEXT

答案 4 :(得分:0)

可能是微不足道的,但它确实起作用了:

$content = gc "D:\posh\stack\test.txt"

$start=139
$end=169

$content | % {$i=0;$lines=@();}{
  if($i -ge $start -and $i -le $end){
   $lines+=$_ -replace 'WARN', 'DEBUG'
   }
  else
  {
    $lines+=$_
  }
  $i+=1
 }{set-content test_output.txt $lines}

答案 5 :(得分:0)

所以我的剧本非常相似,所以我将发布我最终做的事情。

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

我刚刚更换了整行(此脚本中的第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++
}

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

干杯