[Linux 셸 스크립트] 텍스트 처리 - 080 sed로 HTML 파일 속성을 바꿀 때 슬래시 이스케이프 피하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 텍스트 처리 - 080 sed로 HTML 파일 속성을 바꿀 때 슬래시 이스케이프 피하기

by 찬찬이 아빠 2021. 4. 12.
반응형
  1. 사용 명령어

(1) sed

 

  2. 키워드 & 사용처

(1) 키워드

슬래시, 이스케이프

 

(2) 사용처

sed 명령어로 /를 포함한 문자열을 치환할 때 일일이 이스케이프하고 싶지 않을 때 사용합니다.

 

  3. 실행 예제
$ ./sed-slash.sh
화면에 아무것도 표시죄디 않지만 HTML 파일에 있는 /img가 /images/로 치환됨

 

 

  4. 스크립트

#!/bin/sh

 

# 출력 디렉터리 정의

outdir="newdir"

 

# 출력 디렉터리 존재 확인. 없으면 에러 종료

if [ ! -d "$outdir" ]; then           

    echo "출력 디렉터리가 존재하지 않습니다: $outdir" >&2   

    exit 1       

fi

 

# 현재 디렉터리의 html 파일 처리

for htmlfile in *.html           

do

    # 파일 내용에서 /img를 /images/로 변환

    sed "s%/img/%images/%g" "$htmlfile" > "${outdir}/${htmlfile}"     

done

 

 

  5. 해설

이 스크립트는 현재 디렉터리에 있는 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 뒤에 있는 문자를 자동으로 구분자로 보기 때문입니다. 하지만 일반 글자를 지정하면 다른 사람이 읽기 힘들게 되므로 관례적으로 사용하는 %를 지정하는 편이 좋습니다.

 

예제는 우선 에서 치환한 다음 HTML 파일의 출력 디렉터리가 존재하는지 확인합니다. 이때 -d 연산자를 사용합니다. ! 부정 연산자를 함께 써서 존재하지 않거나 디렉터리가 아니라면 에러를 표시하고 종료합니다.

 

에서 for 반복문 in으로  *.html을 지정해서 현재 디렉터리의 HTML 파일을 순서대로 셸 변수 htmlfile로 처리합니다. 에서 sed 명령어에 구분자 %를 지정한 방법입니다. 처음에 셸 변수 outdir로 정의한 디렉터리에 변환한 파일을 출력해서 "newdir"에 저장합닏.ㅏ 이렇게 하면 HTML 파일 링크를 일괄 변경할 수 있습니다.

 

 

<주의사항>

이 예제에서는 단순히 /img/를 /images/로 치환할 뿐이므로 치환 대상 문자열이 HTML 태그에 있는지 확인하지 않습니다. 따라서 HTML 텍스트에 "/img"라는 디렉터리를..." 같은 문장이 있으면 그 내용도 변경됩니다.

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글