echo Impossible|sed 's/Im/To be /'

May 23, 2008

lpython.py -- python 一行文.

Shell 與 Unix Tools 透過 pipe line 組合起來威力強大。系統使用與管理上我很喜歡寫 一行文,因為有些時候這種只用一次的 『咒語』 方便好用,也沒有保留的價值。

但 python 這種利用縮排的程式語言, 一行是個問題。
我實在很想用 Python 寫一行文,『使徒』救我!!


最初的想法

$> python <<EOF
code....
code....
code....
EOF

$> python <<EOF
for i in range(0,10):
    print i
EOF

$> code="
for i in range(0,10):
    print i
"
$> python -c "$code"

更多細節 http://timchen119.blogspot.com/2007/02/shell-scriptpython.htm


進化的版本

  • 利用 "\n" 表示換行
  • 利用 "空白數" 表示縮排階層數
  • 預先引入減少打字數
  • 更多細節 http://timchen119.blogspot.com/2007/07/shell-scriptpython.html


    lpython.py v0.2

  • lpython.py.gz download
  • 安裝: gzip -d lpython.py.gz ; chmod +x lpython.py ; cp lpython.py /usr/local/bin/
  • manual pages: 直接執行 lpython.py 閱讀 manual page.

  • 兩個簡單的範例

    $> cat /etc/passwd | lpython.py 'for i in stdin:\n s=i.split(":"); print s[0],s[5],s[6],'
    $> cat /etc/passwd | lpython.py 'for i in stdin:\n s=i.split(":"); print s[0],s[5],s[6],' -p
    >>>>> PYTHON CODE OUTPUT >>>>>>>>>>>>>>>>>>>>>
    from sys import *
    from os import *
    from time import *
    from re import *
    
    for i in stdin:
            s=i.split(":"); print s[0],s[5],s[6],
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    
    $> lpython.py 'for i in range(1,10):\n for j in range(1,10):\n  print "%dx%d=%d\t" % (j,i,i*j),\n print "\n",'
    $> lpython.py 'for i in range(1,10):\n for j in range(1,10):\n  print "%dx%d=%d\t" % (j,i,i*j),\n print "\n",' -p
    >>>>> PYTHON CODE OUTPUT >>>>>>>>>>>>>>>>>>>>>
    from sys import *
    from os import *
    from time import *
    from re import *
    
    for i in range(1,10):
            for j in range(1,10):
                    print "%dx%d=%d\t" % (j,i,i*j),
            print "\n",
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    
    更多範例請閱讀 manual page。


    其他類似的想法:

  • pyawk.py http://pyawk.sourceforge.net
  • pyone.py http://www.unixuser.org/~euske/pyone/index.html