16 11月 2007

Linux iconv遞迴轉換資料夾底下的檔案編碼

在Linuxl底下有個好用的轉編碼的小工具 - iconv
不過,這個iconv只能拿來轉單一個檔案,並不能直接指定一個資料夾下去遞迴轉換。所有當有大量的檔案需要轉編碼時,就變得有點麻煩了。還好Linux強大的shell指令,可以幫忙解決這個問題,而解決的曙光就來自於find!
find -type f -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result \;  \
-exec mv {} {}.bak \; \
-exec mv {}.result {} \;

以上這段指令分三個階段執行,
  1. 將目前所在的資料夾的檔案找出,丟給iconv執行轉碼,先將結果暫存至{原檔名}.result
  2. 將原本的檔案,改名為{原檔名}.bak
  3. 再將剛暫存的{原檔名}.result,改名稱{原檔名}

iconv的簡介
-l 列出所有支援的編碼格式
-f 要轉換的來源編碼
-t 要轉換的結果編碼
-o 輸出結果的檔案
--verbose 列出處理的檔案名稱


find的簡介
-type [option] 想找出的檔案類型
  • f : 正規的檔案
  • d : 資料夾
-exec [command] 執行指定的command
  • 所有在exec之後的參數,都會被當成是該command的參數,直到 '\;' 符號出現為止
  • 正在處理的檔案名稱,以'{}'取代
-print 印出正在處理的檔名


%% 奇怪的事又發生了,我是使用Ubuntu,shell是tcsh,直接執行「find -type f -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result \;」,結果檔並不會產生,真的是很奇怪,一定要三部分一起寫才有用,有高手可以跟我解釋一下嗎>_<

15 11月 2007

Linux中 字串的取代指令

一般人以為對字串的處理(刪除、取代)是用tr,但是實際上tr只能針對「字元」處理,如果要對「字串」做處理的話,則必須請出sed這個指令了。

以下簡單的比較了tr與sed的用法差別

tr [option] SET1 SET2
  • option -d 刪除, Ex: tr -d 't'
  • option -s 取代, Ex: tr -s 't' 'a'
可將[STDIN]的內容,做字元的取代或刪除
ex:
現有一File:source.txt內容為:
test
tttt
eeee
ssss
tttt
% cat source.txt | tr 'test' 'ABCD'
DBCD
DDDD
BBBB
CCCC
DDDD
注意到這個結果,tr只是單純的將test <=> ABCD做個對應,並將文件內容轉換為
  • t->D
  • e->B
  • s->C


sed [regurage] [file]
可充份地表示「正規表示式」,用法很像perl裡的寫法,input的方式,可由[STDIN]或是File
Ex: 想將'test'取代為'abcd'
% cat source.txt | sed s/test/abcd/g
% sed s/test/abcd/g source.txt
abcd
tttt
eeee
ssss
tttt
說明:
s/// 是取代的意思
s/[from]/[to]/
最後加個g,表示global,就是全部取代的意思,如果不加,則只會取代找到的第一個
[form] & [to]裡頭就可以寫正規表示式

這邊只是粗淺地介紹一下字串取代的功能部分,如果想深入了解,就再去找資料吧XD

14 11月 2007

[Ubuntu] php5安裝extension xsl

原本在我的舊文章有提到Ubuntu 安裝php5+xslt,感謝L大大的寶貴意見,讓我又上到一課了。
原來在php4支援的extension xslt,在php5以後就不支援了,改成支援新的extension xsl,所以原本在php4中用到xslt的地方,要全部改寫成xsl,才能正確地跑在php5+xsl上。幸好我的project,只有一個地方用到xslt,因此只要改小部分就好了。

至於xslt與xsl差在哪邊呢,它們都是用來讀取xsl檔格式的library。但是xslt是function base,xsl是class base。而用了一下之後,果然是新版的比較好,在xsl檔有error時,會秀出error訊息,而原本的xslt要另外寫個function xslt_error_handler去取得error message。


在Ubuntu上安裝php+xsl很簡單:
% apt-get install php5
% apt-get install php5-xsl


以下寫個xsl與xslt寫法的簡單對應:
xslt (function base)
$xsltproc = xslt_create();
xslt_set_encoding( $xsltproc, "UTF-8" );
echo xslt_process( $xsltproc, "input.xml", "falldog.xsl" );

xsl (class base)
$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load("falldog.xsl");
$xsl->importStyleSheet($doc);

$doc->load("input.xml");
echo $xsl->transformToXML($doc);

關於其他xsl的訊息,請參考PHP官方網站說明
http://www.php.net/manual/en/ref.xsl.php