변환 처리_03 HTML 파일에서 특정 속성값 얻기

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

명령어: 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'>처럼 큰따옴표로 열고 작은 따옴표로 닫는 실수를 하기도 합니다. 하지만 여기서는 단순 설명이므로 이런 특수한 경우는 제외했습니다.