about_Split — Split 연산자로 문자열을 쪼개는 법

about_Split — Split 연산자로 문자열을 쪼개는 법

문자열을 구분자(delimiter) 기준으로 여러 조각으로 나눠야 할 때가 많죠. CSV 한 줄을 콤마로 자른다거나, 문장을 공백 단위로 단어로 쪼갠다거나 하는 작업이요. PowerShell의 -split 연산자는 이런 문자열 분리를 아주 유연하게 처리해 줘요. 이 문서에서 연산자의 문법과 각 요소를 하나씩 풀어볼게요.

출처: Microsoft Learn — about_Split

본문

짧은 설명

Split 연산자를 사용해 하나 이상의 문자열을 부분 문자열(substring)로 나누는 방법을 설명해요.

긴 설명

Split 연산자는 하나 이상의 문자열을 부분 문자열로 나눠요. 이 분리 작업에서 바꿀 수 있는 요소는 세 가지예요.

  • 구분자(Delimiter) — 기본값은 공백이지만, 문자, 문자열, 패턴, 스크립트블록을 지정할 수도 있어요. Split 연산자는 구분자에 단순 문자 대신 **정규식(regular expression)**을 사용해요.
  • 부분 문자열의 최대 개수 — 기본값은 모든 부분 문자열을 반환하는 거예요. 부분 문자열 수보다 작은 숫자를 지정하면, 남은 부분 문자열은 마지막 부분 문자열에 합쳐져요.
  • 구분자 일치 조건을 정하는 옵션SimpleMatch, Multiline 같은 것들이요.

Note

설계가 나쁘거나 악의적으로 만든 정규식은 서비스 거부(denial of service) 상황을 만들 수 있어요. 자세한 내용은 about_Comparison_Operators의 Regular expression safety 섹션을 참고하세요.

구문

다음 도표는 -split 연산자의 구문을 보여줘요.

명령에는 매개 변수 이름이 나타나지 않아요. 매개 변수 값만 적어야 하고, 값은 구문 도표에 나온 순서대로 와야 해요.

-split <String>
-split (<String[]>)
<String> -split <Delimiter>[,<Max-substrings>[,"<Options>"]]
<String> -split {<ScriptBlock>} [,<Max-substrings>]

구분자나 스크립트블록을 포함하는 이항 Split 문에는 -split 대신 -isplit-csplit을 쓸 수 있어요. -isplit-split 연산자는 대소문자를 구분하지 않고, -csplit 연산자는 대소문자를 구분해요(구분자 규칙을 적용할 때 대소문자를 고려한다는 뜻이에요).

매개 변수

<String> 또는 <String[]>

분리할 하나 이상의 문자열을 지정해요. 여러 문자열을 넣으면 모든 문자열이 같은 구분자 규칙으로 분리돼요.

예:

-split "red yellow blue green"
red
yellow
blue
green

<Delimiter>

부분 문자열의 끝을 나타내는 문자예요. 기본 구분자는 공백인데, 공백뿐 아니라 줄바꿈(n)과 탭(t) 같은 비출력 문자도 포함해요. 문자열이 분리될 때 구분자는 모든 부분 문자열에서 빠져요. 예:

"Lastname:FirstName:Address" -split ":"
Lastname
FirstName
Address

기본적으로 구분자는 결과에서 빠져요. 구분자의 전체 또는 일부를 보존하려면, 보존할 부분을 괄호로 감싸면 돼요. <Max-substrings> 매개 변수가 추가되면 명령이 컬렉션을 나눌 때 그 값이 우선해요. 구분자를 출력에 포함하기로 하면 명령은 구분자를 출력의 일부로 반환해요. 다만 분리 결과에 구분자를 포함시키기 위해 문자열을 나누는 것은 분리로 집계되지 않아요.

예:

"Lastname:FirstName:Address" -split "(:)"
Lastname
:
FirstName
:
Address

"Lastname/:/FirstName/:/Address" -split "/(:)/"
Lastname
:
FirstName
:
Address

<Max-substrings>

분리 작업이 반환하는 부분 문자열의 최대 개수를 지정해요. 기본은 구분자로 나뉜 모든 부분 문자열이에요. 부분 문자열이 더 많으면 마지막 부분 문자열에 합쳐지고, 더 적으면 모든 부분 문자열이 반환돼요. 값이 0이면 모든 부분 문자열을 반환해요.

예:

$c = "Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune"
$c -split ",", 5
Mercury
Venus
Earth
Mars
Jupiter,Saturn,Uranus,Neptune

-split 연산자에 문자열을 여러 개(문자열 배열) 보내면 Max-substrings 제한은 각 문자열에 각각 적용돼요.

$c = 'a,b,c','1,2,3,4,5'
$c -split ',', 3

a
b
c
1
2
3,4,5

<Max-substrings>는 반환되는 개체 수의 최대값을 지정하는 게 아니에요. 다음 예에서는 <Max-substrings>가 3으로 설정돼 있어요. 그 결과 부분 문자열 값은 세 개지만 출력에는 총 다섯 개의 문자열이 나와요. 최대 세 개의 부분 문자열에 도달할 때까지 구분자가 분리 결과에 포함돼요. 마지막 부분 문자열에 있는 추가 구분자는 그 부분 문자열의 일부가 돼요.

'Chocolate-Vanilla-Strawberry-Blueberry' -split '(-)', 3
Chocolate
-
Vanilla
-
Strawberry-Blueberry

음수 값은 입력 문자열의 끝에서부터 요청한 개수만큼 부분 문자열을 반환해요.

Note

음수 값 지원은 PowerShell 7에서 추가됐어요.

$c = "Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune"
$c -split ",", -5
Mercury,Venus,Earth,Mars
Jupiter
Saturn
Uranus
Neptune

<ScriptBlock>

구분자를 적용하는 규칙을 지정하는 식이에요. 이 식은 $true 또는 $false로 평가되어야 해요. 스크립트블록은 중괄호로 감싸요.

예:

$c = "Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune"
$c -split {$_ -eq "e" -or $_ -eq "p"}
M
rcury,V
nus,
arth,Mars,Ju
it
r,Saturn,Uranus,N

tun

<Options>

옵션 이름을 따옴표로 감싸요. 옵션은 문에 <Max-substrings> 매개 변수를 사용할 때만 유효해요.

Options 매개 변수의 구문은 다음과 같아요.

"SimpleMatch [,IgnoreCase]"

"[RegexMatch] [,IgnoreCase] [,CultureInvariant]
[,IgnorePatternWhitespace] [,ExplicitCapture]
[,Singleline | ,Multiline]"

SimpleMatch 옵션:

  • SimpleMatch — 구분자를 평가할 때 단순 문자열 비교를 사용해요. RegexMatch와 함께 쓸 수 없어요.
  • IgnoreCase-csplit 연산자를 지정했더라도 대소문자를 구분하지 않는 일치를 강제해요.

RegexMatch 옵션:

  • RegexMatch — 구분자를 평가할 때 정규식 일치를 사용해요. 기본 동작이에요. SimpleMatch와 함께 쓸 수 없어요.
  • IgnoreCase-csplit 연산자를 지정했더라도 대소문자를 구분하지 않는 일치를 강제해요.
  • CultureInvariant — 구분자를 평가할 때 언어의 문화적 차이를 무시해요. RegexMatch에서만 유효해요.
  • IgnorePatternWhitespace — 이스케이프되지 않은 공백과 해시 문자(#)로 표시된 주석을 무시해요. RegexMatch에서만 유효해요.
  • Multiline — 다중 라인 모드는 ^$가 입력 문자열의 시작·끝 대신 각 줄의 시작·끝과 일치하도록 해요.
  • Singleline — 단일 라인 모드는 입력 문자열을 한 줄로 취급해요. . 문자가 줄바꿈 \n제외한 모든 문자와 일치하는 대신, 줄바꿈을 포함한 모든 문자와 일치하도록 해요.
  • ExplicitCapture — 명명되지 않은 일치 그룹을 무시해 결과 목록에 명시적 캡처 그룹만 반환해요. RegexMatch에서만 유효해요.

단항 및 이항 split 연산자

단항 split 연산자(-split <string>)는 콤마보다 우선순위가 높아요. 그래서 단항 split 연산자에 콤마로 구분된 문자열 목록을 보내면 첫 번째 콤마 앞의 첫 번째 문자열만 분리돼요.

문자열을 두 개 이상 나누려면 다음 패턴 중 하나를 사용하세요.

  • 이항 split 연산자를 사용한다. (<string[]> -split <delimiter>)
  • 모든 문자열을 괄호로 감싼다.
  • 문자열을 변수에 저장한 뒤 그 변수를 split 연산자에 넘긴다.

다음 예를 보면 차이가 확실해져요.

PS> -split "1 2", "a b"
1
2
a b
PS> "1 2", "a b" -split " "
1
2
a
b
PS> -split ("1 2", "a b")
1
2
a
b
PS> $a = "1 2", "a b"
PS> -split $a
1
2
a
b

예제

공백을 기준으로 문자열을 나눠요.

-split "Windows PowerShell 2.0`nWindows PowerShell with remoting"
Windows
PowerShell
2.0
Windows
PowerShell
with
remoting

콤마마다 문자열을 나눠요.

"Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" -split ','
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

"er" 패턴에서 문자열을 나눠요.

"Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" -split 'er'
M
cury,Venus,Earth,Mars,Jupit
,Saturn,Uranus,Neptune

문자 "N"에서 대소문자를 구분해서 나눠요.

"Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" -csplit 'N'
Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,
eptune

"e"와 "t"에서 나눠요.

"Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" -split '[et]'
M
rcury,V
nus,
ar
h,Mars,Jupi

r,Sa
urn,Uranus,N
p
un

"e"와 "r"에서 나누되, 결과 부분 문자열을 여섯 개로 제한해요.

"Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune" -split '[er]', 6
M

cu
y,V
nus,
arth,Mars,Jupiter,Saturn,Uranus,Neptune

문자열을 세 개의 부분 문자열로 나눠요.

"a,b,c,d,e,f,g,h" -split ",", 3
a
b
c,d,e,f,g,h

문자열 끝에서부터 세 개의 부분 문자열로 나눠요.

"a,b,c,d,e,f,g,h" -split ",", -3
a,b,c,d,e,f
g
h

두 문자열을 각각 세 개의 부분 문자열로 나눠요. (제한은 각 문자열에 독립적으로 적용돼요.)

"a,b,c,d", "e,f,g,h" -split ",", 3
a
b
c,d
e
f
g,h

여러 줄 문자열(here-string)의 각 줄을 첫 번째 숫자에서 나눠요. Multiline 옵션을 사용해 각 줄과 문자열의 시작을 인식해요.

0은 Max-substrings 매개 변수의 "모두 반환" 값을 나타내요. Multiline 같은 옵션은 Max-substrings 값이 지정됐을 때만 쓸 수 있어요.

$a = @'
1The first line.
2The second line.
3The third of three lines.
'@
$a -split "^\d", 0, "Multiline"

The first line.

The second line.

The third of three lines.

백슬래시 문자를 사용해 점(.) 구분자를 이스케이프해요.

기본인 RegexMatch에서는 따옴표로 감싼 점(".")이 줄바꿈 문자를 제외한 모든 문자와 일치하는 것으로 해석돼요. 그래서 Split 문은 줄바꿈을 제외한 모든 문자마다 빈 줄을 반환해요.

"This.is.a.test" -split "\."
This
is
a
test

SimpleMatch 옵션을 사용해 -split 연산자가 점(.) 구분자를 문자 그대로 해석하게 해요.

0은 Max-substrings 매개 변수의 "모두 반환" 값을 나타내요. SimpleMatch 같은 옵션은 Max-substrings 값이 지정됐을 때만 쓸 수 있어요.

"This.is.a.test" -split ".", 0, "SimpleMatch"
This
is
a
test

변수 값에 따라 두 구분자 중 하나에서 문자열을 나눠요.

$i = 1
$c = "LastName, FirstName; Address, City, State, Zip"
$c -split $(if ($i -lt 1) {","} else {";"})
LastName, FirstName
 Address, City, State, Zip

더 알아보기