[Linux 셸 스크립트] 파일처리 - 029 여러 HTML 파일에서 title 태그만 추출해서 각각 다른 파일로 출력하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 파일처리 - 029 여러 HTML 파일에서 title 태그만 추출해서 각각 다른 파일로 출력하기

by 찬찬이 아빠 2021. 3. 18.
반응형
  1. 사용 명령어

(1) basename

(2) sed

 

  2. 키워드 & 사용처

(1) 키워드

for문, 파일 목록, HTML 태그, 다른 파일

 

(2) 사용처

여러 HTML 파일에서 특정 요소만 추출해서 HTML 파일마다 다른 파일로 출력하고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ls output/
$ ./htmltitle.sh
$ ls output/
about.txt index.txt menu.txt

 

 

  4. 스크립트

#!/bin/sh

 

# 현재 디렉터리에 있는  .html 파일이 대상

for htmlfile in *.html             

do

    # 파일명에서 확장자를 뺀 문자열 취득

    fname=$(basename $htmlfile .html)           

 

    # <title> 태그 내용을 후방참조\1로 추출, 파일 출력

    sed -n "s/^.*<title>\(.*\)<\/title>.*$/\1/p" $htmlfile > output /${fname}.txt     

done

 

 

  5. 해설

이 스크립트는 현재 디렉터리 HTML 파일(확장자가 .html)에서 <title> 태그를 추출해서 output이라는 디렉터리에 title 요소를 각각 다른 파일로 저장합니다. 예를 들어 index.html의 title 요소는 index.txt, menu.html은 menu.txt에 출력합니다.

 

에서 HTML 파일을 순서대로 처리하는 for문을 작성합니다. 셸 스크립트로 디렉터리 안에 있는 파일을 순서대로 처리하려면 경로명 확장이 간단한 방법입니다. for문 in뒤에 *.html이라는 패턴을 넣으면 실행 시 다음처럼 경로명 확장이 일어나서 셸 변수 htmlfile을 써서 각 파일을 순서대로 처리할 수 있습니다.

for htmlfile in index.html about.html menu.html
do
...

 

이렇듯 경로명 확장 결과를 for문의 목록으로 넘기는 방법은 다양하게 응용됩니다. 각 파일을 .txt로 출력하기 위해 원래 파일명에서 확장자를 변경한 출력용 파일명을 조합합니다. 그 준비 작업으로 에서 우선 대상 html 파일의 파일명에서 확장자를 제거한 문자열을 얻기 위해서 basename 명령어를 사용합니다. 이 명령어 출력으로 얻는 문자열 뒤에 임의의 확장자를 붙여서 파일명을 만들면 확장자를 바꿔서 출력할 수 있습니다. 이 스크립트에서는 .txt를 사용합니다.

 

은 <title> 태그 내용을 패턴 매치로 추출해서 파일에 출력하는 처리입니다. 패턴 매치된 부분을 추출하는 방법은 다양하지만 여기에서는 sed 명령어의 -n 옵션(패턴스페이스를 출력하지 않음)과 p 플래그(치환이 발생했을 때만 출력)를 조합해서 후방참조 \1로 <title> 태그 내용을 추출합니다.

 

 

<주의사항>

이 스크립트는 html 파일 존재 확인을 생략했으므로 현재 디렉터리에 html 파일이 하나도 없으면 에러가 발생합니다.

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글