- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: sed
키워드: 슬래시, 이스케이프
사용처: sed 명령어로 /를 포함한 문자열을 치환할 때 일일이 이스케이프하고 싶지 않을 때
실행예제
$ ./sed-slash.sh
화면에 아무것도 표시되디 않지만 HTML 파일에 있는 /img가 /images/로 치환됨
스크립트
#!/bin/sh
# 출력 디렉터리 정의
outdir="newdir"
# 출력 디렉터리 존재 확인. 없으면 에러 종료
if [ ! -f "$outdir" ]; then #---------------------------------------- 1(if문)
echo "출력 디렉터리가 존재하지 않습니다: $outdir" >&2
exit 1
fi
# 현재 디렉터리의 html 파일 처리
for htmlfile in *.html #--------------------------------------------- 2
do
# 파일 내용에서 /img/를 /images/로 변환
sed "s%/img/%/images/%g" "$htmlfile" > "${outdir}/${htmlfile}" #--- 3
done
해설
이 스크립트는 현재 디렉터리에 있는 HTML 파일에서 /img/라는 문자열을 /images/로 변경합니다. 치환한 다음 [newdir]이라는 디렉터리에 HTML 파일로 출력합니다. 웹 서버 구성이 변경되어 디렉터리명이 “img”에서 “images”로 변했을 때 사용할 수 있습니다.
sed 명령어로 치환할 때 보통은 s 명령어 뒤에 /(슬래시)로 패턴을 표시합니다. 이때 치환하고 싶은 문자열 자체에 /가 들어 있다면 \ 기호로 이스케이프해야 합니다.
# 문자열 blue를 red로 치환
sed "s/blue/red/g" sample.txt
# 문자열 /img/를 /images/로 치환. \/로 이스케이프
sed "s/\/img\//\/images\//g" sample.txt
작성하기도 번거롭고 치환 문자열도 알기 어려우므로 피하고 싶은 방법입니다.
sed 명령어로 치환할 때 패턴을 지정할 구분자는 /(슬래시)가 아니라도 됩니다. s 뒤에 있는 문자를 자동으로 구분자로 보기 때문입니다. 하지만 일반 글자를 지정하면 다른 사람이 읽기 힘들게 되므로 관례적으로 사용하는 %를 지정하는 편이 좋습니다.
예제는 우선 1
에서 치환한 다음 HTML 파일의 출력 디렉터리가 존재하는지 확인합니다. 이때 -d 연산자를 사용합니다. ! 부정 연산자를 함께 써서 존재하지 않거나 디렉터리가 아니라면 에러를 표시하고 종료합니다.
2
에서 for 반복문 in으로 *.html을 지정해서 현재 디렉터리의 HTML 파일을 순서대로 셸 변수 htmlfile로 처리합니다.
3
에서 sed 명령어에 구분자 %를 지정한 방법입니다. 처음에 셸 변수 outdir로 정의한 디렉터리에 변환한 파일을 출력해서 [newdir]에 저장합니다. 이렇게 하면 HTML 파일 링크를 일괄 변경할 수 있습니다.
주의사항
- 이 예제에서는 단순히 /img/를 /images/로 치환할 뿐이므로 치환 대상 문자열이 HTML 태그에 있는지 확인하지 않습니다. 따라서 HTML 텍스트에 “/img”라는 디렉터리를…” 같은 문장이 있으면 그 내용도 변경됩니다.