Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash 문자열 조작 완벽 가이드 – 길이 확인, 부분 문자열 추출, 찾기와 바꾸기

bash 셸에서 달러 기호($) 뒤에 변수 이름을 붙이면 셸은 해당 변수를 그 값으로 확장합니다. 이처럼 셸이 변수 값을 치환해주는 기능을 매개변수 확장(parameter expansion)이라고 부릅니다.

그런데 매개변수 확장은 단순한 값 치환을 넘어, 확장 과정에서 값을 수정하거나 다른 값으로 대체할 수 있는 다양한 형태를 제공합니다. 이 글에서는 매개변수 확장 개념을 활용해 문자열을 자유롭게 조작하는 방법을 예제와 함께 살펴보겠습니다.

1. bash 셸 스크립트에서 문자열 길이 구하기

${#string}

위 형식은 주어진 변수에 담긴 문자열의 길이를 구할 때 사용합니다.

$ cat len.sh
#! /bin/bash

var="Welcome to the geekstuff"

echo ${#var}

$ ./len.sh
24

변수 이름 앞에 #을 붙이는 것만으로 문자 수를 손쉽게 확인할 수 있습니다. 위 예제에서는 "Welcome to the geekstuff" 문자열의 길이인 24가 출력됩니다.

2. 변수에서 부분 문자열 추출하기

bash는 문자열에서 원하는 부분만 잘라내는 기능도 제공합니다. 다음 예제는 특정 위치부터 지정한 개수만큼의 문자를 추출하는 방법을 보여줍니다.

${string:position}

$string의 $position 위치부터 문자열 끝까지 추출합니다.

${string:position:length}

$string의 $position 위치부터 $length개의 문자를 추출합니다. 이때 length는 반드시 0보다 크거나 같은 숫자여야 합니다.

$ cat substr.sh
#! /bin/bash

var="Welcome to the geekstuff"

echo ${var:15}
echo ${var:15:4}

$ ./substr.sh
geekstuff
geek

위 예제에서 첫 번째 echo 문은 15번째 위치부터 끝까지의 문자열("geekstuff")을 반환하고, 두 번째 echo 문은 15번째 위치부터 4개의 문자("geek")만 반환합니다.

3. 최단 부분 문자열 매칭

다음 문법은 $string의 앞부분에서 $substring과 일치하는 가장 짧은 부분을 삭제합니다.

${string#substring}

반대로 다음 문법은 $string의 뒷부분에서 $substring과 일치하는 가장 짧은 부분을 삭제합니다.

${string%substring}
$ cat shortest.sh
#! /bin/bash

filename="bash.string.txt"

echo "After deletion of shortest match from front:" ${filename#*.}
echo "After deletion of shortest match from back:" ${filename%.*}

$ ./shortest.sh
After deletion of shortest match from front: string.txt
After deletion of shortest match from back: bash.string

첫 번째 echo 문에서 '*.' 패턴은 임의의 문자 뒤에 오는 점(.)에 해당하고, #은 문자열 앞쪽에서 잘라내므로 filename 변수에서 "bash."가 제거되어 "string.txt"가 남습니다. 두 번째 echo 문에서 '.*' 패턴은 점으로 시작하는 부분에 해당하며, %는 문자열 뒤쪽에서 잘라내므로 ".txt"가 삭제되어 "bash.string"이 출력됩니다.

4. 최장 부분 문자열 매칭

다음 문법은 $string의 앞부분에서 $substring과 일치하는 가장 긴 부분을 삭제합니다.

${string##substring}

다음 문법은 $string의 뒷부분에서 $substring과 일치하는 가장 긴 부분을 삭제합니다.

${string%%substring}
$ cat longest.sh
#! /bin/bash

filename="bash.string.txt"

echo "After deletion of longest match from front:" ${filename##*.}
echo "After deletion of longest match from back:" ${filename%%.*}

$ ./longest.sh
After deletion of longest match from front: txt
After deletion of longest match from back: bash

위 예제에서 '##*.'는 '*.' 패턴과 일치하는 가장 긴 부분, 즉 "bash.string."을 잘라내고 남은 "txt"를 출력합니다. 반면 '%%.*'는 뒤쪽에서 '.*' 패턴과 일치하는 가장 긴 부분인 ".string.txt"를 잘라내어 "bash"를 반환합니다.

5. 문자열 찾기 및 바꾸기

첫 번째 일치 항목만 바꾸기

${string/pattern/replacement}

$string에서 pattern과 일치하는 부분을 찾아 첫 번째 일치 항목만 replacement로 교체합니다.

$ cat firstmatch.sh
#! /bin/bash

filename="bash.string.txt"

echo "After Replacement:" ${filename/str*./operations.}

$ ./firstmatch.sh
After Replacement: bash.operations.txt

일치하는 모든 항목 바꾸기

${string//pattern/replacement}

슬래시를 하나 더 붙이면 pattern과 일치하는 모든 항목을 replacement로 교체합니다.

$ cat allmatch.sh
#! /bin/bash

filename="Path of the bash is /bin/bash"

echo "After Replacement:" ${filename//bash/sh}

$ ./allmatch.sh
After Replacement: Path of the sh is /bin/sh

찾기와 바꾸기 작업을 더 강력하게 처리하고 싶다면 sed 치환이나 Vim의 찾기·바꾸기 기능을 함께 활용하는 것도 좋은 방법입니다.

문자열의 시작과 끝 부분만 바꾸기

${string/#pattern/replacement}

pattern이 $string의 시작 부분과 일치할 때만 replacement로 교체합니다.

${string/%pattern/replacement}

pattern이 $string의 끝 부분과 일치할 때만 replacement로 교체합니다.

$ cat posmatch.sh
#! /bin/bash

filename="/root/admin/monitoring/process.sh"

echo "Replaced at the beginning:" ${filename/#\/root/\/tmp}
echo "Replaced at the end:" ${filename/%.*/.ksh}

$ ./posmatch.sh
Replaced at the beginning: /tmp/admin/monitoring/process.sh
Replaced at the end: /root/admin/monitoring/process.ksh

핵심 문법 한눈에 보기

문법설명
${#string}문자열 길이 확인
${string:position}position 위치부터 끝까지 추출
${string:position:length}position부터 length개 문자 추출
${string#substring}앞에서 최단 일치 삭제
${string%substring}뒤에서 최단 일치 삭제
${string##substring}앞에서 최장 일치 삭제
${string%%substring}뒤에서 최장 일치 삭제
${string/pattern/replacement}첫 번째 일치 항목만 치환
${string//pattern/replacement}일치하는 모든 항목 치환
${string/#pattern/replacement}시작 부분이 일치할 때만 치환
${string/%pattern/replacement}끝 부분이 일치할 때만 치환

추천 도서

Bash 101 Hacks – Ramesh Natarajan 저. 필자는 대부분의 시간을 리눅스 환경에서 보내왔기에 자연스럽게 Bash 커맨드 라인과 셸 스크립팅의 열렬한 팬이 되었습니다. 15년 전에는 다양한 *nix 계열 운영체제에서 C 셸과 Korn 셸로 많은 코드를 작성했고, 이후 리눅스 시스템 관리자로 일하면서 가능한 거의 모든 작업을 Bash 셸 스크립트로 자동화했습니다. 그런 경험을 바탕으로 Bash 커맨드 라인과 셸 스크립팅 실전 예제 101가지를 담은 'Bash 101 Hacks' 전자책을 집필했습니다. Bash를 제대로 마스터해 명령 줄과 셸 스크립팅을 완전히 내 것으로 만들고 싶다면 이 책이 큰 도움이 될 것입니다.