我是Powershell的新手。我试图对文件中的文本进行多次替换,但我得到重复的行。我的测试文件包含以下几行:
This is a test.
There is a test.
我运行以下脚本:
(Get-Content "C:\temp\test.txt") |
foreach-object {
if ($_ -match "This"){
$_ -replace "This" , "That"
}
if ($_ -match "test"){
$_ -replace "test" , "toast"
}
} | Set-Content "C:\temp\test.txt"
我的输出应该是:
That is a toast.
There is a toast.
但它在输入的第一行输出单独的行替换:
That is a test.
This is a toast.
There is a toast.
如您所见,在两条线之间,第二条线只符合“匹配”标准之一,并且已正确替换。但是,第一行输出两次 - 每次替换一次。如果该行匹配两个条件,我需要脚本只输出一行。
答案 0 :(得分:2)
您可以轻松获得3行输出。第一个对象是'This is a test'
,与第一个if
匹配,因此它会将'This'
替换为'That'
并输出That is a test
。然后,第一个对象也匹配第二个if
因为有'test'
,所以它也输出'This is a toast'
。最后,第二个对象仅匹配第二个if
,因此它输出'There is a toast'
。因此3行输出。
当您键入$_ -replace 'x','y'
时,它返回另一个对象,它不会更改$ _。如果您正在编写脚本,请将其放在多行上并使其按照您的要求进行操作。
$file = Get-Content $path
foreach($line in $file){
if($line -match 'This'){
$line = $line -replace 'This','That'
}
if($line -match 'test'){
$line = $line -replace 'test','toast'
}
$line
}
答案 1 :(得分:1)
我这样做:
(Get-Content "C:\temp\test.txt") -replace 'This','That' -replace 'test','toast' | Set-Content "C:\temp\test.txt"