powershell多块表达式

时间:2014-02-26 16:47:25

标签: powershell

我正在替换文件中的多个字符串。以下是有效的,但这是最好的方法吗?我不确定做多个块表达式是否是一个好方法。

(Get-Content $tmpFile1) |
ForEach-Object {$_ -replace 'replaceMe1.*', 'replacedString1'} |
             % {$_ -replace 'replaceMe2.*', 'replacedString2'} |
             % {$_ -replace 'replaceMe3.*', 'replacedString3'} |
Out-File $tmpFile2

3 个答案:

答案 0 :(得分:2)

您并不需要通过每次替换操作来预知。这些运算符可以在一个命令中链接:

@(Get-Content $tmpFile1) -replace 'replaceMe1.*', 'replacedString1' -replace 'replaceMe2.*', 'replacedString2' -replace 'replaceMe3.*', 'replacedString3' |
Out-File $tmpFile2

答案 1 :(得分:1)

我将假设您的模式和替换实际上并不是只有一个不同的数字,因此您可能希望根据实际匹配的正则表达式执行不同的代码。 如果是这样,您可以考虑使用单个正则表达式,但使用函数而不是替换字符串。唯一的问题是你必须使用正则表达式Replace方法而不是运算符。

PS C:\temp> set-content -value @"
replaceMe1 something
replaceMe2 something else
replaceMe3 and another
"@  -path t.txt

PS C:\temp> Get-Content t.txt |
ForEach-Object { ([regex]'replaceMe([1-3])(.*)').Replace($_,
   { Param($m)
     $head = switch($m.Groups[1]) { 1 {"First"}; 2 {"Second"}; 3 {"Third"} }
     $tail = $m.Groups[2]
     "Head: $head, Tail: $tail"
   })}
Head: First, Tail:  something
Head: Second, Tail:  something else
Head: Third, Tail:  and another

这对于您今天所需要的内容可能过于复杂,但值得记住您可以选择使用某个功能。

答案 2 :(得分:0)

-replace operator使用正则表达式,因此您可以将三个脚本块合并为一个:

Get-Content $tmpFile1 `
    | ForEach-Object { $_ -replace 'replaceMe([1-3]).*', 'replacedString$1' } `
    | Out-File $tmpFile2

这将搜索文字文本'replaceMe',后跟'1''2''3',并将其替换为'replacedString',后跟任何一位数字找到了('$1')。

另请注意,-replace的作用类似于-match,而不是-like;也就是说,它适用于正则表达式,而不是通配符。当您使用'replaceMe1.*'时,并不意味着“文字'replaceMe1.'后跟零个或多个字符”,而是“文字'replaceMe1'后跟零次或多次出现('*'任何字符('.')“。下面演示了即使它与通配符不匹配也会被替换的文本:

PS> 'replaceMe1_some_extra_text_with_no_period' -replace 'replaceMe1.*', 'replacedString1'
replacedString1

通配符模式'replaceMe1.*'将以正则表达式'replaceMe1\..*'写入,您将看到它会产生预期结果(未执行替换):

PS> 'replaceMe1_some_extra_text_with_no_period' -replace 'replaceMe1\..*', 'replacedString1'
replaceMe1_some_extra_text_with_no_period

您可以在.NET Framework here中阅读有关正则表达式的更多信息。