Skip to content

2. 문자열 조작


BASH는 많은 문자열 조작 연산을 제공한다. 하지만 이 도구들은 하나로 통합되어 있지 않기 때문에 명령어 문법에 일관성이 없고 기능이 중복되어 있다.


문자열 길이를 구하는 연산은 다음과 같다.


연산 설명
${#string},
expr length "$string",
expr "$string" : '.\*'
문자열 길이


문자열 시작에서부터 매칭되는 문자열조각의 길이를 구하는 연산은 다음과 같다.


연산 설명
expr match "$string" "$substring",
expr "$string" : '$substring'
$substring은 정규 표현식


인덱스를 구하는 연산은 다음과 같다.


연산 설명
expr index "$string" "substring" $string에서 일치하는 $substring의 첫 문자의 위치


문자열조각을 추출하는 연산은 다음과 같다.


연산 설명
${string:position} $string$position부터 문자열조각을 추출
string 매개변수가 "*"이거나 "@"라면 position에서 시작하는 위치 매개변수를 추출
${string:position:length} $string$position부터 $length만큼의 문자열조각을 추출
expr substr "$string" "$position" "$length" $string$position부터 $length만큼의 문자를 추출
expr match "$string" '\($substring\)' $string의 처음에서부터 정규 표현식인 $substring을 추출
expr "$string" : '\($substring\)' $string의 처음에서부터 정규 표현식인 $substring을 추출


문자열조각을 삭제하는 연산은 다음과 같다.


연산 설명
${string#substring} $string의 앞 부분에서부터 가장 짧게 일치하는 $substring을 삭제
${string##substring} $string의 앞 부분에서부터 가장 길게 일치하는 $substring을 삭제
${string%substring} $string의 뒷 부분에서부터 가장 짧게 일치하는 $substring을 삭제
${string%%substring} $string의 뒷 부분에서부터 가장 길게 일치하는 $substring을 삭제


문자열조각을 대치하는 연산은 다음과 같다.


연산 설명
${string/substring/replacement} 처음 일치하는 $substring$replacement로 대치
${string//substring/replacement} 일치하는 모든 $substring$replacement로 대치
${string/#substring/replacement} $substring$string의 맨 앞에서 일치하면 $replacement로 대치
${string/%substring/replacement} $substring$string의 맨 뒤에서 일치하면 $replacement로 대치


예제) 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
#!/bin/bash

# 특정 디렉터리의 모든 MacPaint 이미지 파일을
# "pbm" 포맷으로 변환

OPERATION=macptopbm
# 새 파일명 확장자
SUFFIX=pbm

if [ -n "$1" ]; then
    # 디렉터리명이 인자로 주어질 경우
    directory=$1
else
    # 아니면 현재 디렉터리에 대해
    directory=$PWD
fi

# 대상 디렉터리의 모든 파일을
# ".mac" 확장자의 MacPaint 이미지 파일이라고 가정

# 파일명 globbing
for file in $directory/*; do
    # 파일명에서 ".mac" 확장자를 떼어냄
    # '.*c'는 '.'과 'c'를 포함하여
    # 둘 사이의 모든 것과 일치함
    filename=${file%.*c}
    # 변환된 파일을 새 파일명으로 재지향
    $OPERATION $file >$filename.$SUFFIX
    rm -f $file
    echo "$filename.$SUFFIX"
done

exit 0

References