2007년 06월 07일
펄(perl) 명령 한 줄로 모든 파일의 내용을 변경한다.
개발하다 보면 종종 반복적인 노가다성 작업 때문에 무척 괴로울 때가 있다.
가령 '모든 html에서 bgcolor의 속성을 바꿔주세요'라는 요구 사항이 들어온다면 어떻게 하겠는가? 그것도 바로 내일이 오픈이라면?
2001년도에 NIMDA라는 웜이 판칠때 여지없이 고객사에서 전화가 왔었다.
모든 .htm .html .asp 파일의 맨 마지막 부분에 다음과 같은 태그가 붙어 있었다.<html><script language="JavaScript">window.open("readme.eml", null, "resizable=no,top=6000,left=6000")</script></html>
이런, 상황에서 나는 100여 라인의 펄(perl) 스크립트를 짜서 위기를 모면할 수 있었다. (왜 이리 길게 짰던가... ㅡㅡ)
6년이 지난 지금은?
1. cyginwin과 펄을 설치한다. (Unix계열이면 통과)
2. 다음 명령을 내린다. (주의 : 절대로... 생각없이 다음 명령을 실행하지 마세요. 좌절할 수 있습니다.)
find . -type f|egrep -i "\.(htm|html|asp)$"| xargs perl -pi.bak -e 's/^\<html\>\<script language=\"JavaScript\"\>window.open\(\"readme.eml\", null, \"resizable=no,top=6000,left=6000\"\)\<\/script\>\<\/html\>//g'
3. 확인하고 .bak 지운다. (주의 : 절대로... 생각없이 다음 명령을 실행하지 마세요. 좌절할 수 있습니다.)
find . -type f -name "*.bak"|xargs rm -f
한개씩 뜯어보자!
find . -type f
find => 파일 찾는 명령어
. => 현재 디렉토리
-type f => regular file
egrep -i "\.(htm|html|asp)$"
egrep => 정규표현식 명령어
-i => 대소문자 구별없이
"\.(htm|html|asp)$" => .htm .html .asp 로 끝나는 문자
xargs
xargs => 이전 결과를 다음 명령의 입력으로
perl -pi.bak -e 's/^\<html\>\<script language=\"JavaScript\"\>window.open\(\"readme.eml\", null, \"resizable=no,top=6000,left=6000\"\)\<\/script\>\<\/html\>//g'
perl => 우리의 해결사 펄
-p =>
-i => 입력된 파일이름으로 바로 저장함. 백업을 하고 싶으면 .bak과 같은 것을 다음에 입력하면 됨. 입력 파일이 a.htm 이면 a.htm.bak으로 생성됨.
-e => 한줄짜리 펄 명령
's/^\<html\>\<script language=\"JavaScript\"\>window.open\(\"readme.eml\", null, \"resizable=no,top=6000,left=6000\"\)\<\/script\>\<\/html\>//g' => 정규표현식. 아까 지워야 하는놈을 만나면 공백문자로 치환함
정리해 보자면
현재 디렉터리 하위에 모든 일반적인 파일에서
.htm .html .asp를 찾아
기존파일은 .bak으로 저장하고
문자를 치환하는 명령으로 바꾸고 싶은 문자열을 찾아 저장한다.
쯤이 되겠다. 헉헉.
펄... 배워보고 싶지 아니한가?
덧1) 윈도우에서는 테스트 안해봄...
덧2) '모든 html에서 bgcolor의 속성을 바꿔주세요'라는 요구 사항이 들어오면 덧글 달아주세요. 친절상담 가능. (근데...해결못하면? 덜덜덜...)
덧3) httpd.conf에 LoadModule php5_module ......... 을 추가하고 싶다면
perl -pi.bak -e 's/^# LoadModule(.*)/$`$&\nLoadModule php5_module modules\/libphp5.so\n/' httpd.conf
결과 ====>
# LoadModule foo_module modules/mod_foo.so
LoadModule php5_module modules/libphp5.so
# by | 2007/06/07 12:09 | 개발 | 트랙백 | 덧글(9)






☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
저좀 도와 주세요...^.^
textarea때문에 미치겠어요..ㅜㅜ
형 네이트 로그인되어있는거 한번도 못봤어요...
네이트온하고 관련된분이라서 더더욱 안쓰는건가?ㅡ,.ㅡ;;
경희누나는 거의매일 켜있던데...하지만 말걸기 미안함 항상 일하고 계심...
아무튼 수요일저녁쯤에 연락할게요 그때 알려줄수 있죠?
너무너무 허무해요.....
해결했어요.........*.*
textarea태그안에 변수로 한줄내리는거 안되서 물어볼라고 했거든요?
계속 <br>태그 써서 한줄내리려는데 안되는거예요....ㅜㅜ
그러다가 방금 \n하니까 바로 한줄내려가네요...........ㅡ.ㅡ
이거가지고 3일밤샜는데... 방금 그냥 한줄내려가니까 너무 허무하네요.......ㅜㅜ
이거땜에 레포트 못했는데.........아우씨.........짜증나.......
내일이나 모래 자바스크립트말고 자바물어볼께요? 돼죠?
Jtable때문에요...ㅜㅜ
형또 스스로 해결했어요...ㅋ
JTable에서 배열로 불러올려고했는데....
책뒤져보니까 vector쓰더라고요 바꾸니까 바로 되네요.ㅡ,.ㅡ;;
풋...
제가 천재라면 지금 이러고 있겠어요..ㅡ.ㅡ;;
형 12시 넘기면 어떻게해요....ㅎㅎㅎ
12시 안넘기기로 했잔아요...^_^
혹시 저때문에? 안주무시고 기다렸어요?;;