2010年5月16日 星期日

用 regexp 從資料產生指令/程式: 以 stellarium 轉檔為例 (.deb 轉成 .lzm)

不知為何, 從 slax 官網下載的 stellarium 0.10 在我的華碩 z9100 筆電上 秀不出星星; 在另一部 HP 桌機上面, 甚至一執行就出現 segmentation fault。 於是只好在 ubuntu 底下安裝, 然後再把所有 *.deb 帶到 slax 底下轉檔。 安裝前記得先清除 /var/cache/apt/archives/ 底下的 *.deb, 這樣才知道那些是為了 stellarium 而下載的。

關於 .deb 轉 .lzm 請複習 這一篇。 簡單地說, 這兩個指令分別將 deb 轉成 lzm, 還有將 lzm 解壓縮到一個目錄 (all-files/ ) 底下:

    deb2lzm xyz.deb xyz.lzm
    lzm2dir xyz.lzm all-files/

但是這次我們有十幾個檔案要解到同一個目錄下... 面對重複性, 機械化的動作時, 請記得: 懶惰是一種美德。 我們當然不要手動逐一轉。

請先看看這個大家都知道的指令:

    ls *.deb

我們用 perl 將它的輸出整修一下:

    ls *.deb | perl -pe 's#(.*)\.deb#$1.lzm#'

這裡的 s#...#...# 就是代換字串的意思; 而 $1 是指 "先前第一對括弧所抓到的字串"。 當然, 這只是 perl 印出來的字串, 一點意義也沒有 -- 原來的 .deb 檔都還在; 這個指令, 也並沒有真的產生任何 .lzm 檔。 我們純粹是在玩字串變換的遊戲, 只不過這些輸入輸出字串恰好都是檔名而已。 那麼, 何妨再玩 high 一點, 把每個 "檔名" 字串, 都變成 "指令" 字串:

    ls *.deb | perl -pe 's#(.*)\.deb#deb2lzm $1.deb $1.lzm ; lzm2dir $1.lzm all/#'

看到了嗎? 你以前一定見過 「用指令/程式產生資料」; 不過這裡我們 「用資料產生指令/程式」。 喂... 什麼 java 證照? Regular Expressions 才是王道! 它比 java 簡單一百倍; 對於你的日常生活, 卻又比 java 有用一百倍! 我認為這個東西比任何程式語言更值得成為必修課, 應該要放在 java 等等進階課程之前才對。

當然, 以上一直都還是字串遊戲, perl 印得很高興; 其實一點作用也沒有。 但是... 如果把它 pipe 給 bash... 那麼 slax 就真的開始轉檔; 你可以先去吃個點心或跑步一下再回來。 所有的 .deb 都被轉成 .lzm 然後再被解壓縮到同一個目錄 all-files 底下。 現在你可以去裡面改一些設定 (下一段詳), 最後再用 dir2lzm 收割。 如果測試成功, 記得貢獻回 slax, 樹立你自己的功績

附帶一提: 關於 stellarium 的中文顯示問題, 其實只需要改設定檔, 並不需要下載什麼東東。 而且其實還可以更簡單: 建捷徑時若順便將 .ttc 副檔名改為 stellarium 原本設定的 .ttf 副檔名, 就什麼設定檔都不必改了:

    ln -s /usr/share/fonts/TTF/ukai.ttc /usr/share/stellarium/data/ukai.ttf

但不知為什麼, 同樣的這一組 deb 在原先的 ubuntu 底下所安裝的 stellarium, 還需要把 fontmap.dat 裡面的 default DejaVuSans.ttf ... 改成 ukai.ttf 中文才會生效。

7 則留言:

  1. RegExp 比 Java 有用一百倍...... hmmm... 很有趣的論點... Orz

    回覆刪除
  2. _日常生活_ 哦。 以我為例, 過去一年當中, 拿 java 來解決日常生活問題的次數是... 0。 至於 regexp, 每週大約使用三五次 (如果天天只在回信) 至上百次 (如果在包光碟﹑ 寫講義﹑ 解決軟體安裝問題﹑ ...) 不等。 就我而言, regexp 的用處是 java 的無窮倍。 當然, 那也是因為我的 java 學得不怎麼樣。 若是 java 高手, 也許偶爾會拿 java 來解決日常生活的問題。

    至於拿 java 來 _寫大程式_, 那又是另一個問題了。 有很多很棒的軟體都是用 java 寫的, 例如 GeoGebra 我也超愛。 不過... 應該很少人會把這個當做解決 「日常生活」 問題 :-)

    回覆刪除
  3. 200%同意你的看法,因為regex就算不寫程式,拿來搜尋資料也非常好用,我至今已經在ruby,grep,C/C++,JavaScript...等程式語言裡面使用regex

    另外也用regex開發過很多小工具,有空可以交流一下:D

    P.S 光是Mastering Regular Expression我就讀了兩次

    回覆刪除
  4. maybe different os cause this problem.

    回覆刪除
  5. 老師 您好:
    在ptt的RegExp版中看到一個問題,上網想查解決方法。剛好看到您推展regexp的專頁,因此想請您提供一點意見....
    若要用regexp抓出程式碼中「成對、深度不一定的括號」要該如何做呢??(小弟只是會一點regex的上班族,但覺得這問題很有趣)

    該問題的完整敘述如下列連結,尚請老師提供意見:
    https://www.ptt.cc/bbs/RegExp/M.1449895011.A.1A0.html

    回覆刪除
    回覆
    1. 理論上這種問題不適合用 regexp 解, 因為這問題用 stack 做最自然最簡單。 不過據說 perl 可以:
      https://stackoverflow.com/a/133771
      這個太高級了, 我沒用過 :-)

      刪除
    2. 感謝老師的意見....:)

      刪除