PowerShell index[0] 到字符串的第一个实例,index[1] 到第二个实例,依此类推直到完成
PowerShell index[0] to the first instance of the string, index[1] to the second instance and so on till finished
例如,将 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
如何向字符串的第一个实例提供索引[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]
仅设为字符串的第一个实例等等。
您可以使用带有索引的 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
这是一种有点不同的做事方式。 [grin] 什么是...
- 读入文件
我用 here-string 伪造了这个,但在真正这样做时使用 Get-Content。
- 获取匹配行
它使用 -match
对集合起作用的方式来提取与目标匹配的行。
- 在 space 上分裂
- 从该数组中选择前两项
- 向集合中添加一个 $Counter
- 用 space 分隔符连接三个项目
- 将结果行发送到
$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
例如,将 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
如何向字符串的第一个实例提供索引[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]
仅设为字符串的第一个实例等等。
您可以使用带有索引的 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
这是一种有点不同的做事方式。 [grin] 什么是...
- 读入文件
我用 here-string 伪造了这个,但在真正这样做时使用 Get-Content。 - 获取匹配行
它使用-match
对集合起作用的方式来提取与目标匹配的行。 - 在 space 上分裂
- 从该数组中选择前两项
- 向集合中添加一个 $Counter
- 用 space 分隔符连接三个项目
- 将结果行发送到
$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