Powershell -match -replace在输出中产生重复的行

时间:2013-03-21 15:42:56

标签: powershell

我是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.

如您所见,在两条线之间,第二条线只符合“匹配”标准之一,并且已正确替换。但是,第一行输出两次 - 每次替换一次。如果该行匹配两个条件,我需要脚本只输出一行。

2 个答案:

答案 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"