PowerShell index [0] для первого экземпляра строки, index [1] для второго экземпляра и так далее до завершения

Например, замените LINE2 1243 на LINE2 1, потому что он находится в строке 1 файла test.txt.

# Find the line number: 
$lines = sls "LINE2" test.txt | Select-Object -ExpandProperty LineNumber

test.txt:

abc LINE2 1243
lmn LINE2 1250
xyz LINE2 1255

С использованием:

gc test.txt | % { $_ -replace "LINE2.*", "LINE2 $lines" }

Я получил:

abc LINE2 1 2 3
lmn LINE2 1 2 3
xyz LINE2 1 2 3

Как мне предоставить index [0] и только index [0] для первого экземпляра строки, index [1] для второго экземпляра и так далее до завершения.

Сделаем по-другому:

foreach ($line in $lines){
gc test.txt | % { $_ -replace "LINE2.*", "LINE2 $line" }
}

Я получил:

abc LINE2 1
lmn LINE2 1
xyz LINE2 1
abc LINE2 2
lmn LINE2 2
xyz LINE2 2
abc LINE2 3
lmn LINE2 3
xyz LINE2 3

Как мне сделать index[0] только первым экземпляром строки и так далее.


person somebadhat    schedule 14.02.2019    source источник


Ответы (2)


Для этого вы можете использовать цикл for с индексом (если я правильно понял) ;-)

$lines = Select-String "LINE2" -Path C:\sample\test.txt | Select-Object -ExpandProperty LineNumber
Get-Content -Path C:\sample\test.txt -OutVariable Content

for ($index = 0; $index -lt $lines.count; $index++) {
    $Content[$index] -replace "LINE2.*", "LINE2 $($lines[$index])"
}

Вывод:

abc LINE2 1
lmn LINE2 2
xyz LINE2 3
person Olaf    schedule 14.02.2019
comment
В моем исходном сообщении просили отправить вывод в текстовый файл. Итак, мы остаемся на той же странице, как бы вы это сделали? - person somebadhat; 15.02.2019
comment
Я не вижу этого запроса. Но в любом случае - если вам нравится вывод, отправьте в файл, используйте Out-File. - person Olaf; 15.02.2019
comment
Поскольку этот вопрос написан, ваше решение работает. Это не работает с моим настоящим файлом. См. Решение в заголовке stackoverflow.com/questions/54737787/ - person somebadhat; 18.02.2019

это несколько другой способ делать что-то. [ухмылка] что значит ...

  • читает в файле
    я подделал это с помощью строки здесь, но используйте Get-Content, когда делаете это по-настоящему.
  • получает совпадающие строки
    использует способ, которым -match работает с коллекцией, чтобы вытащить строки, соответствующие цели.
  • разбивается на пространства
  • выбирает первые два элемента из этого массива
  • добавляет $ Counter в коллекцию
  • объединяет три элемента с разделителем пробела
  • отправляет полученную строку в коллекцию $Results
  • показывает эту коллекцию на экране
  • сохраняет его в текстовый файл

вот код ...

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
cba line1 1234
abc LINE2 1243
mnl line4 1244
lmn LINE2 1250
zyx line9 1251
xyz LINE2 1255
qwe line9 1266
'@ -split [environment]::NewLine

$Target = 'Line2'

$Counter = 1
$Results = foreach ($IS_Item in ($InStuff -match $Target))
    {
    $IS_Item.Split(' ')[0..-1] + $Counter -join ' '
    $Counter ++
    }

# on screen
$Results

# to a file
$Results |
    Set-Content -LiteralPath "$env:TEMP\somebadhat.txt"

на экране ...

abc 1243 1
lmn 1250 2
xyz 1255 3

в текстовом файле ...

abc 1243 1
lmn 1250 2
xyz 1255 3
person Lee_Dailey    schedule 14.02.2019
comment
Рабочий стол Windows-10. PowerShell 5. Как написано Результаты: cba 1266 1. Ожидаемые результаты: abc LINE2 2. gc test.txt в новом окне PS я получаю: Method invocation failed because [System.Boolean] does not contain a method named 'Split'. В новом окне PS запустите как написано, затем запустите gc test.txt no Ошибка при вызове метода - person somebadhat; 15.02.2019
comment
@somebadhat - опубликованный мной код - точно так, как написано - будет работать в любом сеансе ps5.1 на любой ОС, которая была обновлена ​​до ps5.1 - и win10 должен всегда быть актуальным. какова точная версия PoSh в вашей тестовой системе при запуске $PSVersionTable.PSVersion.ToString()? я получаю 5.1.14409.1018 на моей настройке win7ps5.1. - person Lee_Dailey; 16.02.2019
comment
5.1.17134.590. Я решил свою проблему. Вам больше не нужно над этим работать. - person somebadhat; 18.02.2019
comment
@somebadhat - круто! рад узнать, что у вас все заработало так, как нужно ... [ухмылка] - person Lee_Dailey; 18.02.2019