개요
20장에서 -eq, -like 같은 비교 연산자를 다뤘는데, -match와 -replace는 그 계열에서 정규식을 쓰는 연산자다. 46장의 Select-String이 “파일에서 패턴이 있는 줄"을 찾는 도구라면, -match/-replace는 “문자열 하나가 패턴과 일치하는지, 일치한 부분을 어떻게 바꿀지"를 다루는 연산자 수준의 도구다. 둘 다 내부적으로는 같은 .NET 정규식 엔진을 공유한다.
정신 모델은 “-match는 패턴과 맞는지 참/거짓을 answer하면서 부수적으로 $Matches에 세부 결과를 남기고, -replace는 패턴과 맞는 부분을 다른 문자열로 바꿔치기한다"는 것이다.
사용법
| |
종류
| 요소 | 설명 |
|---|---|
| 문자 클래스 | [0-9], \d(숫자), \w(단어 문자), \s(공백) 등 |
| 수량자 | *(0회 이상), +(1회 이상), ?(0 또는 1회), {n,m}(n–m회) |
| 앵커 | ^(문자열/줄 시작), $(문자열/줄 끝) |
| 캡처 그룹 | (...)로 감싼 부분, 번호($1, $2)로 참조 |
| 이름 있는 캡처 그룹 | (?<이름>...), $Matches.이름이나 ${이름}으로 참조 |
[regex]::Escape() | 정규식 특수문자를 리터럴로 이스케이프하는 정적 메서드 |
예시
| |
주의사항·함정
정규식 앵커($)가 있는 패턴은 반드시 작은따옴표로 감싸야 한다: 큰따옴표 안에서 $는 변수 전개 기호(45장)로 먼저 해석되므로, "^fish$"처럼 큰따옴표로 감싸면 PowerShell이 $를 변수 참조로 오해해 의도와 다르게 동작할 수 있다. 정규식 패턴은 특별한 이유가 없다면 작은따옴표로 작성하는 습관이 안전하다.
$Matches는 항상 마지막으로 성공한 매치 결과만 담고 있다: 반복문 안에서 여러 문자열에 -match를 적용하면 $Matches는 매번 덮어써지므로, 이전 반복의 결과를 나중에 다시 참조할 수 없다. 여러 개의 매치 결과를 모아둬야 한다면 -match 대신 [regex]::Matches()나 Select-String -AllMatches(46장)처럼 전체 결과 컬렉션을 반환하는 방법을 써야 한다.
-replace의 치환 문자열에서 $ 기호는 이중으로 조심해야 한다: 정규식 치환 구문 자체가 $1, ${name}처럼 $를 특수하게 쓰는데, 이 문자열이 큰따옴표라면 PowerShell이 $1을 변수로 먼저 해석하려 시도한다. 작은따옴표를 쓰거나, 부득이 큰따옴표를 쓴다면 `$1처럼 백틱으로 이스케이프해야 한다. $ 자체를 리터럴로 넣고 싶다면 $$를 쓴다.
이식성: Bash의 [[ ... =~ ... ]]나 sed의 정규식은 POSIX ERE/BRE 계열로 문법이 조금씩 다르며(예: 캡처 그룹 참조가 \1), PowerShell은 .NET 정규식(Perl 호환에 가까운 확장 문법, 이름 있는 캡처 그룹 (?<name>...) 등)을 그대로 쓴다는 점이 다르다. Bash sed -E 's/pattern/replace/'가 개념적으로 -replace에 대응한다.
![Featured image of post [PowerShell] 47. -match/-replace 연산자와 정규식](/post/powershell/match-replace-regex-powershell/wordcloud_hu_8ef7b25dce5fb2e5.webp)
![[PowerShell] 45. 문자열 서식과 Here-String](/post/powershell/string-formatting-here-string-powershell/wordcloud_hu_6a3265810b79b68e.webp)
![[PowerShell] 46. Select-String — 텍스트에서 패턴 찾기](/post/powershell/select-string-command-powershell/wordcloud_hu_76a0521c6b7afac7.webp)
![[PowerShell] 47. -match/-replace 연산자와 정규식](/post/powershell/match-replace-regex-powershell/wordcloud_hu_c39cd98b9fc6220f.webp)
![[PowerShell] 48. ConvertTo-Json/ConvertFrom-Json](/post/powershell/convertto-convertfrom-json-powershell/wordcloud_hu_a8973bead7a830f9.webp)
![[PowerShell] 49. Import-Csv/Export-Csv/ConvertTo-Csv](/post/powershell/import-export-csv-command-powershell/wordcloud_hu_41747e6dfda6f23e.webp)
![[PowerShell] 55. switch 고급 모드 — 와일드카드/정규식/파일 처리](/post/powershell/switch-wildcard-regex-file-powershell/wordcloud_hu_106a3f1b500a0d85.webp)
![[PowerShell] 12. Where-Object — 필터링](/post/powershell/where-object-command-filter-pipeline-powershell/wordcloud_hu_75843f29a19f2cc5.webp)
![[PowerShell] 20. 비교 연산자 — -eq/-like/-contains/-in](/post/powershell/comparison-operators-eq-like-contains-in-powershell/wordcloud_hu_e39e3d06b7800d57.webp)
![[PowerShell] 22. -split/-join 연산자](/post/powershell/split-join-operators-powershell-strings/wordcloud_hu_284bbfdffb9b3b18.webp)