2008/05/27

Bash Process Substitution 命令代換

本文大致是翻譯自shell process redirection


為瞭解釋方便,先假設有 a, b, 兩個純文字檔,內容為:

$ cat a
e
d
c
b
a
$ cat b
g
f
e
d
c
b


一般命令的轉向可以結合多個命令成一個,是非常方便的,可是這觀念在早期是從 stdin, stdout 來看才正確,若有個命令要用到 file 的話,就很麻煩,例如 comm 是比對兩個檔案,針對上面的 a, b 要比對的話,可能要先 sort a | uniq > tmp_asort b | uniq > tmp_b,之後再用 comm -3 tmp_a tmp_b

底下直接列出比較方便的方式:

comm -3 <(sort a | uniq) <(sort b | uniq)

說明:
<(command list) 會把命令結果當輸入,所以上面 <(sort a | uniq) 結果會被當成一個 file 供 comm 當輸入用 >(command list) 會把命令結果寫入

儲存空間共享 wuala

http://wua.la/

一般線上的儲存空間我就不多說,我是也有在用,只是很少真正拿來儲存檔案。早期我用過 gmail 來當儲存空間,叫 gdrive 或 gspace, 這跟 gfs 這個字無關。

wuala 是一個比較特別的儲存空間共享系統,可以在 Windows, Mac OS, Linux 上執行,它的理念是,你安裝後,可以免費取得 1G 的空間。對,你會想說這樣的空間並不大。所以真正有價值的理念是,它需要你貢獻你的儲存空間出來,若你貢獻了 10G, 而你平常「發呆」的時間夠長,譬如有一成的時間你可以給別人用的話,那你就可以增加 10G x 10% == 1G 的空間。

什麼?這有什麼好處?意思是,若你的電腦平時也都有開著,那你的發呆比例就會上升不是?那麼你可以使用的空間會多更多。往壞的方向想,你會說,那豈不是更浪費自己的儲存空間?要這麼想似乎也對,但是天下沒有白吃的午餐,當你把自己的空間貢獻出來的話,你就會獲得相對應大小的線上空間,這似乎才是比較長久的策略。

因為我還沒正式使用,只是先跟大家分享而已,有心得再跟大家報告。

正規表示法 regular expressions for bash

bash regular expressions

這篇主要算是翻譯自上面的文章。一般在寫 shell script 時,比對字串通常用的是 grep, sed, cut,col 等等工具,但是 Bash 較新的版本其實內建正規表示法運算子 =~ 可供使用,這有點像 perl, 但是又可以不必把龐大的 Perl 包裝進去。

因為正規表示法的比對是多匹配的,匹配結果放在 BASH_REMATCH 這個環境陣列變數中,整體結果放 BASH_REMATCH[0], 第一個匹配樣式放 BASH_REMATCH[1].....

直接給範例比較簡單:


#!/bin.bash
# saved as bashre.sh
if [[ $# -lt 2 ]]; then
echo "Usage: $0 PATTERN STRINGS..."
exit 1
fi
regex=$1
shift
echo "regex: $regex"
echo

while [[ $1 ]]
do
if [[ $1 =~ $regex ]]; then
echo "$1 matches"
i=1
n=${#BASH_REMATCH[*]}
while [[ $i -lt $n ]]
do
echo " capture[$i]: ${BASH_REMATCH[$i]}"
let i++
done
else
echo "$1 does not match"
fi
shift
done


執行結果如下:

$ ./bashre.sh 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc
regex: aa(b{2,3}[xyz])cc

aabbxcc matches
capture[1]: bbx
aabbcc does not match