Changeset 192:553c824afb91

mearie.org/current

File journal/2006/07/urldecode-for-shell-script.ko.txt

← 177:68798dace1c6 192:553c824afb91 224:1d46270eb038
Author:
Kang Seonghoon <public+hg@mearie.org>
Committed on
Permission:
-rw-r--r--

blog entries now preserve "category" properties in their source files (not visible in the rendered form yet)

      1 ## vim: syn=mako
      2 <%inherit file="../../entry.tmpl.html"/>
      3 <%!
      4 title = u'urldecode for shell script'
      5 when = '2006-07-13T21:54:33+09:00'
      6 category = u'삽질'
      7 original = 'http://tokigun.net/blog/entry.php?blogid=136'
      8 %>
      9 
     10 목표: 유닉스 계열 쉘 스크립트나 명령줄에서 쓸 용도로, 표준 입력의 <`%B1%A4`> 같은 것들을 디코딩해서 표준 출력으로 보내려고 한다. 짧아서 alias에 바로 갖다 쓸 수 있으면 더욱 더 좋고, 웬만한 유닉스에서 다 돌아 가는 portable한 방법이라면 더할 나위 없다.
     11 
     12 
     13 선택 1
     14 -------
     15 
     16 언제나 그렇듯이 바로 생각할 수 있는 대안은 펄이다. 펄이 없는 유닉스 환경은 생각하기 힘들기 때문에 보통은 이걸로 충분할 것이다.
     17 
     18 	perl -pe 's/%([0-9a-f]{2})/pack('C',hex($1))/segi;'
     19 
     20 
     21 선택 1.5
     22 ----------
     23 
     24 만약 펄이 싫다면 다른 언어를 써 보는 것도 괜찮겠다. php 4.3.0 이상 버전이라면,
     25 
     26 	php -r 'echo urldecode(file_get_contents("php://stdin"));'
     27 
     28 파이썬이라면,
     29 
     30 	python -c 'import sys,urllib;sys.stdout.write(urllib.unquote(sys.stdin.read()))'
     31 
     32 루비라면,
     33 
     34 	ruby -ruri -p -e '$_=URI.decode$_'
     35 
     36 뭐 등등 여러 가지 많을 것이다. (어째 예시로 든 언어들이 한결같이 표준 라이브러리에 urldecode 함수가 있는 듯. -_-a)
     37 
     38 
     39 선택 2
     40 -----------
     41 
     42 bash와 기본 유닉스 유틸리티만을 사용하는 방법이다. (&copy; 2004 [Huidae Cho](http://geni.ath.cx/unix.html#toc5), GNU GPL)
     43 
     44 	echo -e "$(sed 's/+/ /g; s/%/\\x/g')"
     45 
     46 이 방법의 가장 큰 문제는 echo -e는 bash에만 있다는 것이다. 뭐, 나처럼 bash만 쓰는 사람은 별 상관 없다 -_-;
     47 
     48 
     49 선택 3
     50 ---------
     51 
     52 [Burnhard 님](http://burnhard.openlook.org/)에 따르면 urldecode를 한 방에 할 수 있는 다음과 같은 명령이 있다고 한다.
     53 
     54 	unvis -h
     55 
     56 반대로 urlencode는 <`vis -h`>로 된다. 그러나 안타깝게도 `vis`/`unvis`(1)은 BSD 계열에만 있으며, 그나마 <`-h`> 옵션은 NetBSD 3.0 이상에만 존재하는 것으로 보인다. OTL
     57 
     58 
     59 선택 4
     60 --------
     61 
     62 이런 삽질에 `awk`(1)가 빠지면 재미가 없을 것이다. -_-; 만약 가장 작은 코드를 추구한다거나 하는 ㅂㅌ짓을 하고 싶지 않다면, awk를 사용하는 [urldecode](http://gnosislivre.org/~aurium/cgi-bin/urldecode)(by Heiner Steven) 프로그램도 나쁘진 않을 듯 하다. 내가 보기에는 적어도 awk 프로그램은 호환성 있는 걸로 보이는데, 긴 텍스트의 경우 에러가 발생할 수도 있다 하니 주의가 필요하다.
     63 
     64 
     65 결론
     66 -------
     67 
     68 세상은 넓고 삽질할 거리는 넘쳐 난다. -_-;;; 혹시 좀 더 흥미롭고 쓸만한 방법을 찾으신 분께서는 지체 없이 연락해 주셨으면 한다.
     69 

Powered by Mercurial