- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: sed
키워드: 빈 줄, 경량화, 전송률, 압축
사용처: 모바일 사이트 등 전송량을 조금이라도 줄여야 하는 웹사이트 파일을 경량화하고 싶을 때
실행예제
$ ./delline.sh
$ ls newdir/
samplejs test.js =>디렉터리 newdir에 현재 디렉터리 js 파일에서 빈 줄을 제거한 파일을 출력
스크립트
#!/bin/sh
# 변환 파일 출력용 디렉터리명
outdir="newdir" #--------------------------------------------------- 1
# 파일 출력용 디렉터리 확인
if [ ! -d "$outdir" ]; then #--------------------------------------- 2(if문)
echo "Not a directory: $outdir"
exit 1
fi
for filename in *.js #---------------------------------------------- 3
do
# 빈줄 또는 스페이스나 탭 문자만 있는 줄을 sed 명령어 d로 삭제
sed '/^[[:blank:]]*$/d' "$filename" > "${outdir}/${filename}" #--- 4
done
해설
이 스크립트는 현재 디렉터리에 있는 자바스크립트 파일(확장자 .js)에서 빈 줄 및 탭, 스페이스만 있는 줄을 삭제해서 파일 크기를 경량화합니다. 모바일용 사이트나 조금이라도 전송량을 줄이고 싶을 때 사용할 수 있습니다.
1
에서 우선 변환 후 출력용 디렉터리를 정의합니다. 여러 js 파일을 처리하므로 그것을 셸 변수 outdir에 정의한 디렉터리에 출력합니다.
2
에서 출력용 디렉터리를 확인합니다. -d는 대상이 디렉터리인지 확인하는 연산자입니다. 부정 연산자 !와 함께 써서 출력용 디렉터리가 존재하지 않거나 디렉터리가 아니면 에러를 표시하고 종료합니다.
3
에서 for문 in으로 *.js
를 지정해서 현재 디렉터리의 자바스크립트 파일을 순서대로 셸 변수 filename으로 처리합니다.
4
sed 명령어가 빈 줄 또는 탭, 스페이스만 있는 줄을 삭제해서 출력한 예입니다. sed 명령어에 /<패턴>/d로 "d"를 지정하면 패턴과 일치하는 줄을 삭제합니다.패턴>
삭제할 패턴에서 사용한 [[:blank:]]는 POSIX 문자 클래스입니다. 여기서 [:blank:]는 스페이스 기호나 탭 기호 등 공백에 해당하는 문자 집합입니다. 이걸 다시 [ ]로 싸서 공백 기호의 문자 클래스를 지정합니다. 뒤에 *
가 있으므로 이것은 ‘줄 처음부터 끝까지 0번 이상 공백 문자가 이어진’줄과 일치합니다. 즉, 빈 줄 또는 탭이나 스페이스만 있는 줄이 되므로 sed 명령어 출력 결과를 리다이렉트해서 불필요한 줄만 삭제한 결과를 얻을 수 있습니다. 여기서 출력할 곳을 셸 변수 outdir로 정의한 디렉터리로 지정해서 변환한 파일을 newdir 디렉터리에 저장합니다.
자바스크립트 파일 크기를 줄이는 전용 툴도 많습니다. 파일 크기에 민감한 모바일 사이트라면 그런 경량화 툴을 사용하지만 여기에서는 셸 스크립트를 사용한 예를 들어보았습니다.
주의사항
-
이 스크립트는 파일 줄바꿈 코드가 LF(\n)로 전제합니다. CRLF(\r\n)라면 빈 줄에 해당하지 않습니다.
-
경량화 툴은 빈 줄을 삭제할 뿐만 아니라 줄바꿈 마저 제거하기도 합니다. 그런 코드를 작성하고 싶으면
4
를 다음처럼 바꾸면 됩니다.sed '/^[[:blank::]]*$/d' "$filename" | tr -d '\n' > "${outdir}/${filename}"