텍스트처리_17 텍스트 파일에서 HTML 파일 만들기

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

명령어: sed
키워드: HTML, 이스케이프, 문자 참조, 줄바꿈, 텍스트 파일
사용처: 서버에서 텍스트 파일을 간단한 HTML 파일로 변환해서 웹 브라우저로 보고 싶을 때


실행예제

$ cat sample.txt
1 + 1 < 3
"Hello!"
A & B

$ ./txt2html.sh sample.txt > sample.html
$ cat sample.html      <-------------------변환한 HTML 확인
1 + 1 &lt; 3<br>
&quot;Hello!&quot;<br>
A &amp; B<br>

스크립트

#!/bin/sh

# HTML에서 이스케이프가 필요한 기호를 문자 참조로 치환
# 마지막에 줄 끝을 <br> 태그로 치환
sed -e 's/&/\&amp;/g' \  #---------------------- 1
-e 's/</\&lt;/g' \
-e 's/>/\&gt;/g' \
-e "s/'/\&#39;/g" \
-e 's/"/\&quot;/g' \
-e 's/$/<br>/' \  #----------------------------- 2 
"$1"

   

해설

이 스크립트는 텍스트 파일을 간단한 HTML 파일로 변환해서 출력합니다. 서버에 있는 텍스트 파일을 웹 브라우저에서 간단히 보고 싶을 때 사용할 수있습니다.

원격 호스트에서 작업하다 보면 거기에 있는 매뉴얼 같은 텍스트 파일을 터미널 기가 아니라 웹 브라우저에서 보고 싶을 때가 있습니다. 그럴 때 긴 줄이 있으면 IE 등에서는 자동으로 단어 넘김(wrap)을 지원하지 않아 가로 스크롤바가 표시되어서 보기 힘들어집니다.

  • 브라우저의 텍스트 파일 가독성이 좋지 않음

    그러나 책이 쓰인 시점과 다르게 현재 브라우저에서는 텍스트가 길어지면 스크롤바가 생기지 않고 자동 줄바꿈 해서 보여줍니다.(참고)

HTML 파일이라면 긴 줄도 자동으로 넘겨주므로 텍스트 파일을 HTML 파일로 바꿔서 브라우저에서 표시하면 편리할 것입니다. 따라서 예제에서 텍스트 파일을 간단한 HTML 파일로 바꿔봅니다.

텍스트 파일을 HTML 파일로 만들려면 <html> 태그와 <head> 태그를 조합하는 등의 여러 준비가 필요합니다. 하지만 여기에서는 브라우저에만 표시되면 충분하므로 단순히 줄 끝에
을 추가하는 간단한 방법을 사용합니다. 이때 불필요한 자바스크립트 같은 코드가 실행되지 않도록 HTML에서 이스케이프가 필요한 기호를 처리합니다. 이는 보안을 위한 처리이기도 합니다.

사용자가 웹 브라우저로 볼 프로그램에 외부에서 입력하는 값을 쓴다면 악의가 있는 공격자가 오염시킨 값이 들어 있을 가능성이 있다는 걸 늘 의식해야 합니다. 예를 들어 자바스크립트는 텍스트 파일로 보면 별 문제가 없지만 웹 브라우저에서 해석할 때는 위험한 공격 코드가 실행될지도 모릅니다. 따라서 누군가가 작성한 텍스트 파일을 웹 브라우저에서 보는 프로그램이라면 HTML 태그를 이스케이프해서 무효화하는 처리가 중요합니다. 그리고 PHP나 루비 같은 일반적인 스크립트 언어라면 전용 이스케이프 함수가 준비되어 있습니다.

1은 sed 명령어로 여러 패턴을 한꺼번에 치환합니다. 이렇듯 1처럼 sed 명령어 -e 옵션으로 패턴을 이어서 지정하면 파이프 처리를 쓰지 않아도 여러 패턴을 작성할 수 있습니다. 그리고 1은 HTML에서 이스케이프가 필요한 기호를 문자 참조로 치환합니다. 이때 치환할 기호는 다음과 같습니다.

  • 브라우저에서 표시하기 위한 치환

    원래 기호 치환 문자
    & &amp;
    < &lt;
    > &gt;
    &#39;
    &quot;

작은따옴표와 큰 따옴표를 치환할 때 sed 명령어 전체를 싸는 따옴표 기호에 주의해야 합니다. 예제에서는 기본적으로 모두 작은따옴표 기호로 쓰고 있는데 작은따옴표 기호 치환 "s/'/\&#39;/g"에서는 '를 이스케이프하지 않아도 되도록 “로 둘러싸고 있습니다.

2치환 패턴은 줄 끝에 <br> 태그를 추가하는 처리입니다. 셸 스크립트에서 텍스트 줄끝에 특정 문자열을 추가하는 방법은 많지만 예제에서는 sed 명령어로 처리합니다. sed 명령어에서 $가 줄 끝을 나타내므로 이것을 <br>로 치환하면 추가 가능합니다.
이것이 's/$/<br/' 라는 치환 패턴입니다.

이 스크립트는 sed 명령어 치환 패턴을 나열한 것에 불가하지만 이런 처리를 직접 실행하면 실수하기도 하므로 스크립트로 자동화하면 좋습니다.

   

주의사항

  • 스크립트에서 작성한 HTML 파일은 <html> 태그나 <head> 태그도 없어 제대로된 HTML 파일이 아닙니다. 단순히 텍스트를 더 보기 쉽게 만든 HTML 이라고만 이해하기 바랍니다.

  • 다른 스크립트 언어에서 HTML 태그를이스케이프하는 함수는 다음과 같습니다.

    • HTML 이스케이프 함수

      언어 함수명
      PHP htmlspecialchars
      escapeHTML(CGI.pm 모듈 사용)
      루비 CGI.escapeHTML