Bash Shell Script - 문자열 자르기 (substring, split)

By JS | Last updated: October 09, 2021

리눅스의 Bash shell에서 문자열을 자르는 방법을 소개합니다.

1. 특정 범위의 문자열 자르기

다음과 같은 Syntax로 특정 Index 범위의 문자열을 자를 수 있습니다. offset은 문자열이 시작하는 index를 입력하며, length에는 offset부터 자르고 싶은 길이를 입력합니다.

echo "${STR:offset:length}"

다음 코드는 Index 0에서 5개의 문자까지 잘라서 str 변수에 저장합니다.

#!/bin/bash
str="Hello, World, Bash!"
echo "${str:0:5}"

Output:

$ bash example.sh
Hello

1.1 특정 범위의 문자열 자르기 (2)

다음과 같이 length를 입력하지 않으면 offset부터 문자열 끝까지 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:7}"

Output:

$ bash example.sh
World, Bash!

1.2 문자열 뒤에서 자르기

다음과 같이 offset을 음수로 설정하면 문자열 뒤에서 offset을 계산합니다. str변수에서 offset -5B의 위치가 됩니다. 그리고 length를 입력하지 않았기 때문에 문자열 끝까지 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:(-5)}"

Output:

$ bash example.sh
Bash!

length를 입력하면 offset에서 입력한 길이만큼 문자열을 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo "${str:(-5):2}"

Output:

$ bash example.sh
Bash!

2. cut 명령어로 문자열 자르기

2.1 문자 1개 추출

cut -c 8는 문자열에서 8번째 문자를 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8

Output:

$ bash example.sh
W

만약 cut -c 8,12처럼 입력하면, 8번째와 12번째의 문자가 추출됩니다.

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8,12

Output:

$ bash example.sh
Wd

2.2 특정 범위의 문자열 자르기

cut으로 설정한 범위의 문자열을 추출할 수 있습니다. cut -c Start-End처럼 자르고 싶은 문자열 범위를 지정할 수 있습니다. 주의할 것은 문자열의 Offset은 1부터 시작합니다.

다음 예제에서 cut -c 8-12는 8번째에서 12번까지의 문자열을 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8-12

Output:

$ bash example.sh
World

2.3 범위 지정 시, 문자열 끝 범위 생략

다음과 같이 문자열 끝 범위를 지정하지 않으면, 문자열 끝까지 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c 8-

Output:

$ bash example.sh
World, Bash!

2.4 범위 지정 시, 문자열 시작 범위 생략

다음과 같이 문자열 시작 범위를 지정하지 않으면, 문자열 첫번째부터 끝 범위까지 자릅니다.

#!/bin/bash

str="Hello, World, Bash!"
echo $str | cut -c -5

Output:

$ bash example.sh
Hello

3. 패턴으로 특정 문자열 자르기

문자열에서 패턴을 찾고, 그 문자를 삭제할 수 있습니다. 문자열에 따라 짧게 일치하는 패턴이 있고, 길게 일치하는 패턴이 있는데, 명령어에 따라서 어떤 패턴을 삭제할지 결정할 수 있습니다.

3.1 첫번째 문자열 포함, 가장 짧게 매칭되는 문자열 삭제

${STR#PATTERN}는 STR 변수의 문자열 중에, 첫번째 문자열을 포함하고, 패턴과 일치하는 문자열을 찾습니다. 그 중에 가장 짧게 일치하는 패턴을 삭제합니다.

아래 예제의 문자열에서 A*B 패턴을 찾으면, AAAB가 가장 짧게 일치하는 패턴이고, AAABBB가 가장 길게 일치하는 패턴입니다. 실행 결과를 보시면 가장 짧게 일치하는 문자열이 삭제됩니다.

#!/bin/bash

str="AAABBBCCC"
echo ${str#A*B}

Output:

$ bash example.sh
BBCCC

3.2 첫번째 문자열 포함, 가장 길게 매칭되는 문자열 삭제

${STR##PATTERN}는 STR 변수의 문자열 중에, 첫번째 문자열을 포함하고 패턴과 일치하는 문자열을 찾습니다. 그 중에 가장 길게 일치하는 패턴을 삭제합니다.

아래 예제의 문자열에서 A*B 패턴을 찾으면, AAAB가 가장 짧게 일치하는 패턴이고, AAABBB가 가장 길게 일치하는 패턴입니다. 실행 결과를 보시면 가장 길게 매칭되는 문자열이 삭제됩니다.

#!/bin/bash

str="AAABBBCCC"
echo ${str##A*B}

Output:

$ bash example.sh
CCC

3.3 마지막 문자열 포함, 가장 짧게 매칭되는 문자열 삭제

${STR$PATTERN}는 STR 변수의 문자열 중에, 마지막 문자열을 포함하고 패턴과 일치하는 문자열을 찾습니다. 그 중에 가장 짧게 일치하는 패턴을 삭제합니다.

아래 예제의 문자열에서 B*C 패턴을 찾으면, BCCC가 가장 짧게 일치하는 패턴이고, BBBCCC가 가장 길게 일치하는 패턴입니다. 실행 결과를 보시면 가장 짧게 매칭되는 문자열이 삭제됩니다.

#!/bin/bash

str="AAABBBCCC"
echo ${str%B*C}

Output:

$ bash example.sh
AAABB

3.4 마지막 문자열 포함, 가장 길게 매칭되는 문자열 삭제

${STR$PATTERN}는 STR 변수의 문자열 중에, 마지막 문자열을 포함하고 패턴과 일치하는 문자열을 찾습니다. 그 중에 가장 길게 일치하는 패턴을 삭제합니다.

아래 예제의 문자열에서 B*C 패턴을 찾으면, BCCC가 가장 짧게 일치하는 패턴이고, BBBCCC가 가장 길게 일치하는 패턴입니다. 실행 결과를 보시면 가장 길게 매칭되는 문자열이 삭제됩니다.

#!/bin/bash

str="AAABBBCCC"
echo ${str%B*C}

Output:

$ bash example.sh
AAABB

4. 특정 문자로 문자열 분리하기

cut 명령어를 사용할 때 구분자를 지정할 수 있고, 그 구분자를 기준으로 문자열을 분리할 수 있습니다.

cut -d ':' -f1는 문자열에서 :를 기준으로 문자열을 분리하고, 분리된 문자열들 중에 첫번째 문자열을 str에 저장합니다. 만약 두번째로 분리된 문자열을 얻고 싶다면 -f2로 지정하시면 됩니다.

#!/bin/bash

str="Hello:World:Bash"

echo $str | cut -d ':' -f1
echo $str | cut -d ':' -f2
echo $str | cut -d ':' -f3

Output:

$ bash example.sh
Hello
World
Bash

References

댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha