2014年3月30日 星期日

使用sed替換命令s(ubstitute)時改變內定分隔符號的用途

標準的sed替換命令的格式是:
sed 's/PATTERN/REPLACEMENT/g' 

意思是把字串pipe進去處理時, 將字串中的PATTERN換成REPLACEMENT
其中/這個分隔符號是可以換的, 作法就是直接換, 像這樣
sed 's#PATTERN#REPLACEMENT#g'

讀書的時候對這個功能的用途感到很不解,
後來有一天讀named的chroot init script, 裏頭有一段是這樣

ROOTDIR=`echo $ROOTDIR | sed 's#//*#/#g;s#/$##'`;

用途是為了去掉ROOTDIR中重複或是出現在尾端的/號,
不換掉分隔符號的話就得寫成這樣

ROOTDIR=`echo $ROOTDIR | sed 's/\/\/*/\//g;s/\/$//'`;

方才恍然大悟, 難怪當年寫路徑置換寫到昏頭轉向,
換個分隔符號看起來就簡單多了, 在處理路徑或是日期字串的時候好用

2014年3月26日 星期三

Vim - 字元(Char), 詞(Word), 句(Sentence) 與 段落(Paragraph)的差別與移動方式

Vim也能像Emacs一樣以文章結構(字, 詞, 句, 段)為單位進行處理.

Column(欄)
表示vim中每一行有幾個字, 如果打了80個字母後就到了畫面邊緣, 那麼column就是80.

Char(字元)
表示單一個ASCII字元
h|l, 游標前進及後退到下一個字元

Word(詞)
由連續的非空白字元組成, 由空白隔開(space)

w|b 與 W|B , 游標前進及後退到下一個Word的第一個字母, 差別在w|b會考慮到標點符號, 因此游標會在兩個標點符號間移動, W|B只接受以空白為Word的分隔.

e|ge與 E|gE, 游標前進及後退到下一個Word的最後一個字母, 而不是第一個, ge是組合鍵, 表示先按g再按e

Sentence(句)
以".",  "!",  "?"結尾, 後面跟著換行符號, 空白 或是 tab
(|), 游標前進及後退到下一句的第一個字

Paragraph(段)
由句子(Sentence)組成, 以空一行(Empty Line)隔開, 以空白鍵按出的空白行並不會被考慮成段落的分隔,
{|}, 游標前進及後退到下一段落的第一個字

Vim - 在畫面中移動

Vim中把整篇文章當作一個超長字串來看的時候, 有這些編輯移動方式

四方向移動(hjkl)
hjkl, 用直覺聯想 h 與 l 分別將游標往左與右移動一個字元, j 往下一行, k 往上一行, 如果習慣用標準鍵位打字會發現在文章中上下移動不過就是右手食指與中指的事, 很方便.

行內移動(0^$)
0|$, 將游標移動到行內第一及最後一個字元, ^則是移動到行內第一個不是空白的字元

尋找同行字元x(fx|tx)
fx|Fx 與 tx|Tx, 游標移動到同一行中的下一個x字元, Fx與Tx則是往回移動,
fx|Fx 與 tx|Tx 的差別是fx|Fx(Find)將游標停在字元上, tx|Tx(To)則是停在字元前

括號間移動
% - 尋找下一個出現的括號 例如(), [] 或 {} 並將游標停在上面, 繼續按游標會在與之成對的括號間來回移動
[( | [{ - 往回找沒關好的(或是{
]) | ]} - 往前找沒關好的)或是}

文章內移動
?G - 移動到文章內第?行
gg - 移動到文章頭
G - 移動到文章尾
?% - 移動到文章百分之?處

跳躍點(Jump)間移動
命令能造成游標移動出本行稱之為一個Jump(字元搜尋fx|tx 與四方向移動造成的
不算跳躍),
此時的位置會被記錄下來成為跳躍點
`` - 在當前位置與上一跳躍點間移動
Ctrl+O|I - 跳回上|下一個跳躍點
:jumps - 列出跳躍點
:marks - 列出位置標記
m[a-z] - 標記當前位置, 總共可以記錄26個
`[a-z] - 跳回先前紀錄的跳躍點
'[a-z] - 跳回先前紀錄的紀錄點所在行首
特殊mark:
' - Jump前的游標位置
" - 上次編輯檔案時的游標位置
[ - 上次變動的開頭
] - 上次變動的結尾

同畫面內移動
H - 移動到畫面內第一行
M - 移動到畫面內中間行
L - 移動到畫面內最下一行

翻頁(Scrolling)
Ctrl+E|Y - 上下翻一行
Ctrl+U|D - 上下翻半頁
Ctrl+F|B - 上下翻一頁
zt - 畫面往下翻直到游標所在行變成第一行
zz - 捲動畫面畫面直到游標所在行位於畫面中間
zb - 畫面往上翻直到游標所在行變成最後一行

了解現在游標相對於全部文章的位置
.Ctrl+G - 顯示在螢幕下方, 順序為 檔名 行數 總行數 位於文章內%處 第幾個字
.:set number - 每行前方顯示行數的開關
.:set ruler - 常駐顯示在右下角, 順序為 行數 第幾個字 位於文章內%處