powershell: заменить символ в TXT-файле в определенной позиции - PullRequest
2 голосов
/ 05 февраля 2020

Здравствуйте, у меня есть такой текстовый файл (имя test.txt)

        Z     , HADEtatPat ,"HAD : Evolution de l'‚tat du patient" ,44                           
////////B     , HADDialyse ,"Dialyse hors centre depuis HAD"   , 21                          
       W     , HADAutre   ,"HAD : Hors protocole"            , 13                    
//        p     , HADPIA     ,"HAD : PIA sejour vers SSR/PSY"     , 17                      
        x     , HADS‚aEJ   ,"D‚part vers S‚ance de Chimio./Radioth‚./Dialyse dansé " , 22

Я хочу заменить символы 1 и 2 строки 4 на '@@'

как сделать это

Я пытаюсь

Get-Content test.txt | Select -Index 3 | replace-char position 1,2 by '@' | replace-content test.txt

, но не работает, спасибо за помощь

Мне нужно

1 Ответ

2 голосов
/ 05 февраля 2020

Вы можете сделать следующее для простого случая замены первых двух символов указанной строки:

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...