- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: sed
키워드: HTML, 이스케이프, 문자 참조, 줄바꿈, 텍스트 파일
사용처: 서버에서 텍스트 파일을 간단한 HTML 파일로 변환해서 웹 브라우저로 보고 싶을 때
실행예제
$ cat sample.txt
1 + 1 < 3
"Hello!"
A & B
$ ./txt2html.sh sample.txt > sample.html
$ cat sample.html <-------------------변환한 HTML 확인
1 + 1 < 3<br>
"Hello!"<br>
A & B<br>
스크립트
#!/bin/sh
# HTML에서 이스케이프가 필요한 기호를 문자 참조로 치환
# 마지막에 줄 끝을 <br> 태그로 치환
sed -e 's/&/\&/g' \ #---------------------- 1
-e 's/</\</g' \
-e 's/>/\>/g' \
-e "s/'/\'/g" \
-e 's/"/\"/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에서 이스케이프가 필요한 기호를 문자 참조로 치환합니다. 이때 치환할 기호는 다음과 같습니다.
-
브라우저에서 표시하기 위한 치환
원래 기호 치환 문자 & &
< <
> >
’ '
” "
작은따옴표와 큰 따옴표를 치환할 때 sed 명령어 전체를 싸는 따옴표 기호에 주의해야 합니다. 예제에서는 기본적으로 모두 작은따옴표 기호로 쓰고 있는데 작은따옴표 기호 치환 "s/'/\'/g"
에서는 '
를 이스케이프하지 않아도 되도록 “로 둘러싸고 있습니다.
2
치환 패턴은 줄 끝에 <br>
태그를 추가하는 처리입니다. 셸 스크립트에서 텍스트 줄끝에 특정 문자열을 추가하는 방법은 많지만 예제에서는 sed 명령어로 처리합니다. sed 명령어에서 $
가 줄 끝을 나타내므로 이것을 <br>
로 치환하면 추가 가능합니다.
이것이 's/$/<br/'
라는 치환 패턴입니다.
이 스크립트는 sed 명령어 치환 패턴을 나열한 것에 불가하지만 이런 처리를 직접 실행하면 실수하기도 하므로 스크립트로 자동화하면 좋습니다.
주의사항
-
스크립트에서 작성한 HTML 파일은 <html> 태그나 <head> 태그도 없어 제대로된 HTML 파일이 아닙니다. 단순히 텍스트를 더 보기 쉽게 만든 HTML 이라고만 이해하기 바랍니다.
-
다른 스크립트 언어에서 HTML 태그를이스케이프하는 함수는 다음과 같습니다.
-
HTML 이스케이프 함수
언어 함수명 PHP htmlspecialchars 펄 escapeHTML(CGI.pm 모듈 사용) 루비 CGI.escapeHTML
-