我正在替换文件中的多个字符串。以下是有效的,但这是最好的方法吗?我不确定做多个块表达式是否是一个好方法。
(Get-Content $tmpFile1) |
ForEach-Object {$_ -replace 'replaceMe1.*', 'replacedString1'} |
% {$_ -replace 'replaceMe2.*', 'replacedString2'} |
% {$_ -replace 'replaceMe3.*', 'replacedString3'} |
Out-File $tmpFile2
答案 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中阅读有关正则表达式的更多信息。