Вы можете сделать следующее для простого случая замены первых двух символов указанной строки:
$line = 0
(Get-Content test.txt | Foreach-Object {
if ($line++ -eq 2) {
$_ -replace '^..','@@'
} else { $_ }
}) | Set-Content test.txt
$line
будет увеличиваться до текущего номера строки перед оценкой по 2
. Как только строка 2
(начиная со строки 0
) будет найдена, первые два символа ^..
(выражение регулярного выражения для начала строки ^
и любые два символа .
) будут заменены на @@
.
Для замены символов 3
и 6
в строке 2 вы можете использовать метод, аналогичный описанному выше:
$line = 0
(Get-Content test.txt | Foreach-Object {
if ($line++ -eq 2) {
$_ -replace '(?<=^.{3}).|(?<=^.{6}).','@'
} else { $_ }
}) | Set-Content test.txt
Если вы хотите сделать это более динамичным c с переменными параметрами вы можете сделать следующее, чтобы заменить символы в позициях 3
и 5
в строке 3
:
$line = 3 # Starting from 0
$characters = 3,5 # Array of character positions starting from 0
$replacechar = '@' # Character you want to insert
$count = 0
(Get-Content test.txt | Foreach-Object {
if ($count++ -eq $line) {
$temp = $_.ToCharArray()
foreach ($pos in $characters) {
$temp[$pos] = $replacechar
}
-join $temp
} else { $_ }
}) | Set-Content test.txt
Если вы не против использования System.Text.StringBuilder
объекты, то вы можете сделать следующее, чтобы заменить символы в позициях 3
и 5
в строке 3
:
$line = 3 # Starting from 0
$characters = 3,5 # Starting from 0
$replacechar = '@'
$content = Get-Content test.txt
foreach ($pos in $characters) {
$content[$line] = ([System.Text.StringBuilder]$content[$line]).Replace($content[$line][$pos],$replacechar,$pos,1).ToString()
}
$content | Set-Content test.txt