2011-05-18 76 views
5

如果有一個文件,例如test.config,該文件包含第140行和第170行之間的工作「WARN」,還有其他「WARN」字在其中的行,但我想用字「DEBUG」替換第140行和第170行之間的「WARN」,並保留文件的其餘文本相同,保存時只在第140行和第170行之間將「WARN」替換爲「DEBUG」。剩下的所有文字都不受影響。使用powershell替換文件的指定行號

回答

0

這是測試文件

text 
text 
DEBUG 

DEBUG 


TEXT 

-

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

Out.txt這個樣子

文本 文本 DEBUG

DEBUG

TEXT

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 
+0

有趣的提示,我不知道這件事。 – JasonMArcher 2011-05-18 15:50:20

+0

我想我首先在@ShayLevy的一些評論/發佈/推文中看到了這一點。 – stej 2011-05-18 19:26:07

+0

Stej你的答案完美無缺,它令人興奮,我需要的是 – Janki 2011-05-19 00:03:43

0

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

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

$start=139 
$end=169 

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

使用數組切片:

$內容=獲取 - 內容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 
0

所以我的腳本非常相似,所以我打算髮布我最終做的事情。

我有一堆服務器都在同一個位置有相同的腳本,我需要更新所有腳本中的路徑。

我剛剛更換整條生產線(在此腳本行3)和重寫了劇本背出

我的服務器名稱和「路徑」,以取代舊的路徑被存儲在陣列(你可以拉,從一個DB如果你想自動化的IT更多:

$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++ 
} 

它的工作原理,併爲我節省了大量的時間登錄到每個服務器並更新每個路徑。唉

乾杯

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陣列爲-EachObject cmdlet「%」
    • 對於數組中的每個項目,請檢查行號($ _。ReadCount)
    • 如果行號140-170,用WARN替換DEBUG;否則寫入行未修改。
    • 注意:您必須添加「Else {$ _}」。否則,文本文件將只包含修改後的行。
    • 設置,內容寫的內容,文本文件
+0

請在你的回答中添加一個簡短的解釋。 – 2015-11-24 16:03:13

+2

已添加說明 – WayneC 2015-11-24 17:01:28