【发布时间】:2011-05-18 06:43:03
【问题描述】:
如果有一个文件,例如 test.config ,该文件在第 140 行和第 170 行之间包含工作“WARN”,还有其他行中有“WARN”字样,但我想在第 140 行之间替换“WARN”和 170 带有单词“DEBUG”,并保持文件的其余文本相同,并且在保存时,“WARN”仅在第 140 行和第 170 行之间替换为“DEBUG”。其余所有文本不受影响。
【问题讨论】:
标签: powershell
如果有一个文件,例如 test.config ,该文件在第 140 行和第 170 行之间包含工作“WARN”,还有其他行中有“WARN”字样,但我想在第 140 行之间替换“WARN”和 170 带有单词“DEBUG”,并保持文件的其余文本相同,并且在保存时,“WARN”仅在第 140 行和第 170 行之间替换为“DEBUG”。其余所有文本不受影响。
【问题讨论】:
标签: powershell
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"
说明:
【讨论】:
看看$_.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
【讨论】:
使用数组切片:
$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
【讨论】:
这是测试文件
text
text
DEBUG
DEBUG
TEXT
--
PS:\ gc .\stuff1.txt |% { [system.text.regularexpressions.regex]::replace($_,"WARN","DEBUG") } > out.txt
Out.txt 是这样的
文本 文本 调试
调试
文字
【讨论】:
可能是微不足道的,但它可以完成工作:
$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}【讨论】:
所以我的脚本非常相似,所以我将发布我最终做了什么。
我有一堆服务器,它们都在同一个位置使用相同的脚本,我需要更新所有脚本中的路径。
我刚刚替换了整行(此脚本中的第 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++
}
它有效,并为我节省了大量登录每个服务器和更新每个路径的时间。呃
干杯
【讨论】: