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
这对于您今天所需要的可能过于复杂,但值得记住的是,您可以选择使用函数。我将假设您的模式和替换并不真正具有数字功能