Индекс PowerShell [0] для первого экземпляра строки, индекс [1] для второго экземпляра и так далее до конца - PullRequest
0 голосов
/ 14 февраля 2019

Например, замените 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

Как мне предоставить индекс [0] и только индекс [0] для первого экземпляра строки, индекс [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] только для первого экземплярастроки и т. д.

Ответы [ 2 ]

0 голосов
/ 14 февраля 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
0 голосов
/ 14 февраля 2019

Вы можете использовать цикл 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
...