Замена текста в указанном номере строки файла с помощью powershell - PullRequest
5 голосов
/ 18 мая 2011

Если есть один файл, например, test.config, этот файл содержит работу «WARN» между строками 140 и 170, в других строках есть слово «WARN», но я хочу заменить «WARN» между строками 140и 170 со словом «DEBUG», и оставьте остальной текст файла таким же, и при сохранении «WARN» заменяется «DEBUG» между строками 140 и 170.оставшийся весь текст остается без изменений.

Ответы [ 6 ]

6 голосов
/ 18 мая 2011

Посмотрите на $_.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
2 голосов
/ 24 ноября 2015

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 "%"
    • Для каждого элемента в массиве проверьте номер строки ($ _. ReadCount)
    • Если номер строки 140-170, заменить WARN на DEBUG; в противном случае напишите строку без изменений.
    • ПРИМЕЧАНИЕ: Вы ДОЛЖНЫ добавить «Else {$ _}». В противном случае текстовый файл будет содержать только измененные строки.
    • Set-Content для записи содержимого в текстовый файл
2 голосов
/ 18 мая 2011

Использование нарезки массива:

$ 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
0 голосов
/ 06 ноября 2013

Так что мой сценарий очень похож, поэтому я собираюсь опубликовать то, что я в итоге сделал.

У меня было несколько серверов с одинаковым сценарием в одном месте, и мне нужно было обновитьпуть во всех сценариях.

я просто заменил всю строку (строка 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++
}

, это работает, и сэкономило мне кучу времени, заходя на каждый сервер и обновляя каждый путь.

0 голосов
/ 18 мая 2011

Может быть тривиально, но это делает работу:

$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}
0 голосов
/ 18 мая 2011

Это тестовый файл

text
text
DEBUG

DEBUG


TEXT

-

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

Out.txt выглядит так

текст текст DEBUG

DEBUG

TEXT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...