powershell多块表达式

powershell多块表达式,powershell,Powershell,我正在替换文件中的多个字符串。以下方法可行,但这是最好的方法吗?我不确定执行多个块表达式是否是一种好方法 (Get-Content $tmpFile1) | ForEach-Object {$_ -replace 'replaceMe1.*', 'replacedString1'} | % {$_ -replace 'replaceMe2.*', 'replacedString2'} | % {$_ -replace 'replaceMe3.*

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

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

您实际上不需要foreach完成每个替换操作。这些运算符可以在单个命令中链接:

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

您实际上不需要foreach完成每个替换操作。这些运算符可以在单个命令中链接:

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

您实际上不需要foreach完成每个替换操作。这些运算符可以在单个命令中链接:

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

您实际上不需要foreach完成每个替换操作。这些运算符可以在单个命令中链接:

@(Get-Content $tmpFile1) -replace 'replaceMe1.*', 'replacedString1' -replace 'replaceMe2.*', 'replacedString2' -replace 'replaceMe3.*', 'replacedString3' |
Out-File $tmpFile2
使用正则表达式,因此可以将三个脚本块合并为一个,如下所示:

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\..*'
,您将看到它产生预期的结果(不执行替换):

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

使用正则表达式,因此您可以将三个脚本块合并为一个,如下所示:

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\..*'
,您将看到它产生预期的结果(不执行替换):

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

使用正则表达式,因此您可以将三个脚本块合并为一个,如下所示:

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\..*'
,您将看到它产生预期的结果(不执行替换):

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

使用正则表达式,因此您可以将三个脚本块合并为一个,如下所示:

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\..*'
,您将看到它产生预期的结果(不执行替换):


您可以阅读更多关于.NET Framework中正则表达式的内容。

我假设您的模式和替换并不只是在末尾有一个不同的数字,因此您可能希望根据实际匹配的正则表达式执行不同的代码。 如果这样,您可以考虑使用单个正则表达式,但是使用函数而不是替换字符串。唯一的问题是您必须使用regex
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

这对于您今天所需要的可能过于复杂,但值得记住的是,您可以选择使用函数。

我将假设您的模式和替换并不真正具有数字功能