我已经搜索了相当数量的答案,但我得到的就是如何用多个字符串来完成它。我是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次出现?
答案 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
的位置并捕获所有内容。然后使用捕获组1
将2
替换为$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
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
}
如果我使用我在第一篇文章中使用的代码,它只会将所有内容放回一行,我理解为什么但不能在String操作之后再将它放回到同一个地方。我使用PowerGUI atm来更好地掌握它。