본문 바로가기
Old Posts/Linux

[Linux] Bash 문자열 변수 조작 (자르기, 치환, 삭제)

by A6K 2021. 6. 24.

Bash 스크립트를 작성하다보면 간단하게 문자열 변수를 조작하고 싶을 때가 있다. 예를 들어 따옴표로 감싸진 문자열 값에서 앞, 뒤에 있는 따옴표를 제거한 알맹이만 꺼내고 싶을 때가 있다. Bash에서는 문자열 변수를 간단하게 조작할 수 있는 몇 가지 기능을 제공한다.

1. 문자열 변수 연결

문자열 변수의 값들을 연결하는 Concat 동작은 간단하다. 

new_value=${old_value1}-with-${old_value2}

이런식으로 사용하면 'old_value1' 변수의 값과 'old_value2' 변수의 값 사이에 '-with-' 문자열을 추가한 형태의 새로운 문자열이 만들어진다.

2. 문자열 변수 자르기

프로그래밍 언어에서 문자열을 '슬라이싱(slice)'하는 경우가 종종 있다. Bash에서는 문자열의 특정 부분을 잘라내기 위해서 다음 문법을 사용한다.

${변수이름:시작점} # 시작점부터 끝까지 골라냄
${변수이름:시작점:개수} # 시작점부터 개수에 해당하는 문자를 골라냄
${변수이름:시작점:-(개수)} # 시작점부터 변수의 맨 뒤쪽에서 개수에 해당하는 인덱스 앞쪽까지 골라냄

예제로 알아보자

$ STR="ABCDEFGH"
$ echo ${STR:0}
ABCDEFGH
$ echo ${STR:4}
EFGH
$ echo ${STR:2:3}
CDE

문자열의 인덱스는 0부터 시작하며, 시작점으로 입력한 인덱스에 해당하는 문자열은 포함된다. 주의 해야할 점은 시작점 뒤에 추가로 줄 수 있는 숫자는 시작점부터 포함될 문자의 개수라는 점이다. ${STR:2:3} 의 경우 2번 인덱스에서 3번 인덱스까지의 문자열을 골라내는걸로 착각하지 않도록 하자.

만약 개수에 해당하는 값을 음수 값으로 주면, 뒤에서 입력한 숫자까지만 포함한다. 예를 들어

$ STR="ABCDEFGH"
$ echo ${STR:2:-2}
CDEF

-2 값을 주면 STR 변수의 뒤에서 2번째 인덱스에 해당하는 문자의 앞쪽까지만 포함하게 된다. 끝 지점에 해당하는 문자는 포함되지 않음을 주의하자. 

시작점 값을 음수로 주면 기준점이 뒤쪽이 된다. 즉, ${STR: -2:2}의 의미는 STR 변수의 뒤쪽에서 2번째 인덱스에 해당하는 문자열부터 2개 문자를 골라내는 것이다. 반대로 생각하면된다. 이 때, 음수 시작지점은 한칸 띄우거나 괄호로 묶어줘야한다.

3. 문자열 삭제

문자열 변수의 앞뒤쪽에 오는 특정 패턴을 삭제할 수 있다. 대표적으로 따옴표로 감싸져있는 문자열에서 따옴표를 제거하고 알맹이를 가져오는 동작이 필요할 수 있다.

${변수이름#삭제문자} # 시작지점을 포함하여 가장 짧게 매칭되는 패턴을 삭제
${변수이름##삭제문자} # 시작지점을 포함하여 가장 길게 매칭되는 패턴을 삭제
${변수이름%삭제문자} # 끝지점을 포함하여 가장 짧게 매칭되는 패턴을 삭제
${변수이름%%삭제문자} # 끝지점을 포함하여 가장 길게 매칭되는 패턴을 삭제

삭제문자에 해당하는 값은 일반적인 문자가 될 수도 있고, ? 문자나 * 문자를 이용한 와일드카드도 허용된다. 예를 들어

STR=${STR#\"}
STR=${STR%\"}

이런식으로 실행하면 STR 변수에 앞뛰 쌍따옴표가 있으면 제거된다. 만약 맨 앞과 맨 뒤에 쌍따옴표가 없다면 아무런 삭제도 일어나지 않는다.

4. 문자열 일부 치환

문자열에서 특정 패턴을 찾아 바꾸는 동작도 제공된다. (사실 파이프라이닝해서 sed 명령을 더 많이 쓰지 않나 싶다)

${변수이름/찾을패턴/바꿀문자} # 패턴에 맞는 최초 문자열을 수정
${변수이름//찾을패턴/바꿀문자} # 패턴에 맞는 모든 문자열을 수정

전자는 최초 매칭되는 1개의 문자 패턴만 바꾼다. 두 번째는 패턴에 맞는 모든 문자열을 찾아바꾼다.

5. 문자열 길이 구하기

${#변수이름}

 

댓글