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