- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: expr
키워드: 패턴 매치, 문자열, HTML, 속성
사용처: 변수 내부 문자열에서 특정 패턴과 일치하는 부분을 추출할 때
실행예제
$ ./expr-match.sh
/about/
/sitemap/
/plan1.html
http://www.example.org/
스크립트
#!/bin/sh
quote="[\"']" #------------------------------------------------------ 1
match="[^\"']*" #---------------------------------------------------- 2
while read line
do
href=$(expr "$line" : ".*href=${quote}\(${match}\)${quote}.*") #--- 3
if [ $? -eq 0 ]; then
echo $href
fi
done < index.html
해설
이 스크립트는 현재 디렉터리에 있는 index.html 파일에서 HTML 태그의 href 속성을 찾아서 그 속성값을 표시합니다. HTML 파일에서 어떤 속성값을 취득하려면 패턴 매치를 써서 해당 부분을 뽑아내는 방법이 간편합니다. 셸 스크립트에서 패턴 매치하는 방법은 다양한데 여기에서는 expr 명령어를 사용하겠습니다.
expr 명령어는 덧셈 같은 수치 연산 목적으로 자주 사용하지만 “expr 변수명 : 패턴” 형식의 정규표현식에 활용해서 변수와 문자열에서 일치하는 부분을 추출하는데 사용할 수 있습니다. 한편 괄호는 이스케이프해야 하므로 실제 표기 방법은 “(패턴)“이 됩니다. 다음 예의 출력 결과는 “pen”입니다.
string="This is a pen."
expr "$string" : " This is a \(.*\)."
예제에서는 “href 속성은 큰따옴표 또는 작은따옴표로 시작해서 끝난다”라는 HTML 작성법을 고려해서 우선 1
에서 따옴표 부분을 표현하는 정규표현식을 준비합니다. 따옴표 기호는 이스케이프가 필요해서 패턴 안에 같이 쓰면 보기 어려우므로 이렇게 별도로 셸 변수로 정의해둡니다.
2
에서는 href 속성 부분에 일치하는 정규표현식을 준비합니다. 따옴표 기호 속 문자열이므로 ‘큰따옴표 또는 작은따옴표 이외의 문자열’이 되므로 ^로 부정 표현 뒤에 이런 따옴표 기호를 나열합니다. 3
에서 expr 명령어로 파일에서 한 줄씩 읽어서 일치 여부를 확인합니다. expr은 일치했을때만 종료 스테이터스가 0이 되므로 특수 변수 $?가 0일 때만 표시하면 href 속성값을 출력할 수 있습니다.
주의사항
-
expr 명령어는 ‘무거운’ 명령어라서 그다지 빠르지 않습니다. 대량의 텍스트 처리는 sed나 awk가 낫습니다.
-
오래된 HTML이라면
<a href=doc.html>
처럼 속성값이 따옴표로 둘러싸지 않은 채 그대로 적혀 있기도 합니다. 또는<a href="doc.html'>
처럼 큰따옴표로 열고 작은 따옴표로 닫는 실수를 하기도 합니다. 하지만 여기서는 단순 설명이므로 이런 특수한 경우는 제외했습니다.