PowerShell将index [0]指向字符串的第一个实例,将index [1]指向第二个实例,依此类推直到完成

时间:2019-02-14 02:02:02

标签: powershell windows-10-desktop

例如,将LINE2 1243替换为LINE2 1,因为它位于test.txt的第1行。

# 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]赋予字符串的第一个实例,依此类推。

2 个答案:

答案 0 :(得分:1)

您可以使用带有索引的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

答案 1 :(得分:0)

这是一种有点不同的做事方式。 [咧嘴]是什么...

  • 读取文件
    我用here-string伪造了此字符串,但在实际执行此操作时使用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