각 교체 작업을 통해 실제로 foreach 할 필요가 없습니다. 이러한 연산자는 단일 명령으로 연결할 수 있습니다.
@(Get-Content $tmpFile1) -replace 'replaceMe1.*', 'replacedString1' -replace 'replaceMe2.*', 'replacedString2' -replace 'replaceMe3.*', 'replacedString3' |
Out-File $tmpFile2
-------------------나는 당신의 패턴과 교체가 실제로 다른 숫자를 가지고 있지 않다고 가정 할 것이므로 실제로 일치하는 정규식에 따라 다른 코드를 실행하고 싶을 수 있습니다. 그렇다면 단일 정규식을 사용하지만 대체 문자열 대신 함수를 사용하는 것을 고려할 수 있습니다. 유일한 문제 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
이것은 오늘날 필요한 것에 대해 지나치게 복잡 할 수 있지만 함수를 사용할 수있는 옵션이 있다는 것을 기억하는 것이 좋습니다.
--------------------replace
운영자는 이 같은 일에 당신의 세 가지 스크립트 블록을 병합 할 수 있도록 정규 표현식을 사용합니다 :
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.'
0 개 이상의 문자 다음에"이 아니라 "텍스트가 'replaceMe1'
0 개 이상 발생 (다음 '*'
의) 모든 문자 ( '.'
)". 다음은 와일드 카드와 일치하지 않더라도 대체 될 텍스트를 보여줍니다.
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의 정규식에 대한 자세한 내용을 읽을 수 있습니다 .
출처
https://stackoverflow.com/questions/22050284