[Shell Script] HTML 파일에서 태그 속에 적힌 주석을 추출하여 그대로 실행하기
HTML 파일에서 태그 속에 적힌 주석을 추출하여 그대로 실행하기
파일에 적힌 문자열을 추출하여 명령어로 실행할 때 사용합니다 .
#!/bin/sh
filename="myapp.log"
eval $(sed -n "s/<code>\(.*\)<\/code>/\1/p" command.htm)
해설
이 스크립트는 command.htm 파일안에 적힌 <code>태그를 추출하여 그 요소를 명령어로 실행합니다 .
command. htm
<html>
<head><title>Code List</title></head>
<body>
<p>This is a sample code</p>
<code>date; ls -l $filename</code>
</body>
</html>
스크립트에서 우선 <code>태그 부분을 패턴 매치해서 추출합니다 .
sed 명령어
sed -n "s/<code>\(.*\)<\/code>/\1/p" command.htm
셸 스크립트에서 일치한 부분의 문자열을 추출하는 방법입니다 .
-n 옵션은 처리 후에 패턴 스페이스 내용을 출력하지 않도록 하는 옵션입니다 .
그대로는 아무것도 출력되지 않아서 의미없으므로 마지막에 p 플래그를 붙여서 일치했을 때만 패턴 스페이스를 출력하도록 합니다 .
- 일치한 줄 중 <code> 태그 부분만 추출하고 싶으므로 후방참조\1을 사용합니다 .
- sed명령어의 일치 확인에서()로 둘러싼 부분 앞에서 순서대로 참조할 수 있습니다 .
- <code>안에 임의의 문자열.*를 ()로 둘러싸서 \1로 추출, \1 부분이 실행하고 싶은 명령어 문자열이 됩니다
이것으로 명령어 문자열을 추출하였으므로 eval을 이용하여 변수확장, 명령어 실행 합니다 .
여기서 sed 명령어 출력은 다음과 같습니다 .
date; ls -l $filename
eval 명령어에 이 문자열을 인수로 넘기면 셸 변수 filename이 치환되어 결과로 이런 코드가 실행 됩니다 .
date; ls -l myapp.log
결과