카테고리 없음

[파워 쉘] powershell 다중 블록 표현식

행복을전해요 2021. 2. 8. 06:47

각 교체 작업을 통해 실제로 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