我在Perl中无数次使用过这种东西:
for ( $someVariable ) {
s/findthis/replaceitwiththis/g;
s/findthat/replaceitwithsomethingelse/g;
}
$someVariable
的值暂时在$_
,并且变量“就地”更新;每个新的替换命令继续更新/覆盖变量的内容。这是一个方便而紧凑的方法,可以在一个简单的循环中完成大量的更改。
Powershell是否具有“for”的相同用途?
在@neolisk的响应后添加评论,以便我可以使用格式化。
$s = 'abcde'
$s | foreach {
$_ -replace 'a','x'
$_ -replace 'e','z'
}
write-host "And: $s"
屏幕上显示的结果:
xbcde
abcdz
And: abcde
还尝试了$_ = $_ -replace 'a','x'
等等。这里必须有一些额外的语法才能获得“就地”替换......
进一步修改@Nacht的回复 。这是有效的,虽然我对后面的嘀嗒声不是很疯狂:
$s = 'now is the time for all good individuals blah blah'
Write-Host $s
$s = $s `
-replace "now", 'NEVER' `
-replace 'time', 'moment' `
-replace "blah\s+blah", '-- oh, WHATEVER'
Write-Host $s
输出:
now is the time for all good individuals blah blah
NEVER is the moment for all good individuals -- oh, WHATEVER
答案 0 :(得分:3)
在Powershell中就是这样,但语法略有不同:
$someVariable | foreach {
Write-Host $_;
}
如果您想进行就地替换,请记住$_
是不可变的,即只读。正确的方法是在管道上输出新的字符串并收集到另一个变量中,因此对于您的示例,它可能如下所示:
$s = 'abcde'
$newS = $s | foreach {
$_ -replace 'a','x' -replace 'e','z'
}
write-host "And: $newS";
答案 1 :(得分:0)
这就是你要找的东西吗?
$s = 'abcde'
$s = $s -replace 'a','x' -replace 'e','z'
write-host "And: $s"
输出:
And: xbcdz
您也可以在以下几行上执行此操作:
$s = 'abcde'
$s = $s -replace 'a','x'
$s = $s -replace 'e','z'
write-host "And: $s"
以下内容不起作用,因为每行都是单独输出的:
$s | foreach {
$_ -replace 'a','x'
$_ -replace 'e','z'
}
以下内容不起作用,因为赋值语句不输出任何内容:
$s | foreach {
$_ = $_ -replace 'a','x'
}
答案 2 :(得分:0)
我不知道以这种方式回答我自己的问题是否合适。如果没有,请告知。总结几种方法(全部检查):
$s = 'abcde' (likewise for all below)
$s | foreach {
$_ `
-replace 'a', 'X' `
-replace 'e', 'Z'
}
执行期间显示XbcdZ
。 $ s 不变。
$s = $s `
-replace 'a', 'X' `
-replace 'e', 'Z'
$ s“就地”更新;价值现在为XbcdZ
$t = $s | foreach {
$_ `
-replace 'a', 'X' `
-replace 'e', 'Z'
}
$ s 不变。 $ t的价值:XbcdZ
$t = $s `
-replace 'a', 'X' `
-replace 'e', 'Z'
$ s不变。 $ t的值:XbcdZ
($t = $s) `
-replace 'a', 'X' `
-replace 'e', 'Z'
Write-Host "`$s: $s -- `$t: $t"
添加了parens以查看可能发生的情况。
两个变量的值都没有变化。 XbcdZ
将打印到控制台上方通过Write-Host打印的行。