Powershell - 替换首次出现的String

时间:2016-06-30 12:48:26

标签: string powershell replace

我已经搜索了相当数量的答案,但我得到的就是如何用多个字符串来完成它。我是PowerShell的新手,但我想知道如何设法做到这一点。

我只是想重新开始第一次出现" 1"用" 2" ......我只能接近但不能接近它。我找到的代码是:

Get-ChildItem "C:\TEST\1.etxt" | foreach {
$Content = Get-Content $_.fullname
$Content = foreach { $Conten -replace "1","2" }
Set-Content $_.fullname $Content -Force
}

txt的内容只是随机的:1 1 1 3 3 1 3 1 3 ...以保持简单。

有人可以解释我是如何做到第一次出现的,如果有可能而且不耗费时间我可以更换例如第3次出现?

3 个答案:

答案 0 :(得分:4)

与马丁相同,但有点简化,所以你可能会更好地理解它:

$R=[Regex]'1'
#R=[Regex]'What to replace'

$R.Replace('1 1 1 3 3 1 3 1 3','2',1)
#R.Replace('Oringinal string', 'Char you replace it with', 'How many')

#Result = '2 1 1 3 3 1 3 1 3'

如果你想要一个单行:

([Regex]'1').Replace('1 1 1 3 3 1 3 1 3','2',1)

找到此信息here

答案 1 :(得分:0)

您可以使用积极的前瞻来查找第一个1的位置并捕获所有内容。然后使用捕获组12替换为$1和其余字符串:

"1 1 1 3 3 1 3 1 3" -replace '(?=1)1(.*)', '2$1'

<强>输出:

2  1 1 3 3 1 3 1 3

要制作第三次出现,你可以这样做:

"1 1 1 3 3 1 3 1 3" -replace '(.*?1.*?1.*?)1(.*)', '${1}2$2'

<强>输出:

1 1 2 3 3 1 3 1 3

答案 2 :(得分:0)

这是非常好的建议。但是现在我想知道当输入文件有多行时它是如何工作的。

  1. 1
  2. 1
  3. 1
  4. 3
  5. 3
  6. 1

    Get-ChildItem "C:\TEST\1.txt" | ForEach-Object { $Content = Get-Content $_.fullname $R=[Regex]'1' $Content = ForEach-Object { $R.Replace($Content, '2', '1') } Set-Content $_.fullname $Content -Force }

  7. 如果我使用我在第一篇文章中使用的代码,它只会将所有内容放回一行,我理解为什么但不能在String操作之后再将它放回到同一个地方。我使用PowerGUI atm来更好地掌握它。