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"라는 디렉터리를..." 같은 문장이 있으면 그 내용도 변경됩니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
지역화폐 147탄 - 경남 하동군(하동사랑상품권, 모바일 하동사랑상품권) (0) | 2021.04.13 |
---|---|
[Linux 셸 스크립트] 텍스트 처리 - 081 오른쪽 정렬로 숫자를 표시하는 텍스트 표 만들기 (0) | 2021.04.12 |
[Linux 셸 스크립트] 텍스트 처리 - 079 웹 접속 로그에서 파일별 접속 횟수 집계하기 (0) | 2021.04.12 |
[Linux 셸 스크립트] 텍스트 처리 - 078 시스템 로그에서 IP 주소마다 횟수 집계하기 (0) | 2021.04.12 |
[Linux 셸 스크립트] 텍스트 처리 - 077 웹 서버 로그 파일에서 특정 상태값만 취득하기 (0) | 2021.04.12 |
댓글