텍스트처리_13 sed로 HTML 파일 속성을 바꿀 때 슬래시 이스케이프 피하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: 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”라는 디렉터리를…” 같은 문장이 있으면 그 내용도 변경됩니다.