現象:
按照《Unix shell 范例精解》試 sed 例子,用的是書自帶光盤裡的文件 datafile。但是運行命令(以兩個數字結尾的行,將結尾兩個數字 ab 替換為 ab.5 )
> sed 's/[0-9][0-9]$/&.5/' datafile
卻沒有輸出,其中某一行最後數字是34,把上面 [0-9][0-9]$ 直接換成 34$ 依舊沒有輸出。 讓人一度以為在這個 Ubuntu 上 $ 元字符不能用。但是這是絕對不可能的,這年頭那個敢不支持 POSIX的正則表達式。
繼續嘗試這個 $元字符,運行例子命令如下(結尾添加 **VACA**):
> sed '/west/,/east/s/$/**VACA**/' datafile
輸出如下:
**VACA**t NW Charles Main 3.0 .98 3 34
**VACA** WE Sharon Gray 5.3 .97 5 23
**VACA**t SW Lewis Dalsass 2.7 .8 2 18
**VACA** SO Suan Chin 5.1 .95 4 15
**VACA**t SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
覺得 **VACA**t 後的那個 t 很可疑,難道是輸出時的覆蓋?因為沒有替換這個地方阿,再試試
> sed '/west/,/east/s/$/**VA**/' datafile
輸出如強烈地支持俺地懷疑,如下:
**VA**est NW Charles Main 3.0 .98 3 34
**VA**n WE Sharon Gray 5.3 .97 5 23
**VA**est SW Lewis Dalsass 2.7 .8 2 18
**VA**rn SO Suan Chin 5.1 .95 4 15
**VA**ast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
於是來個重定向:
>sed '/west/,/east/s/$/**VA**/' datafile > file
> vim file
顯示每行尾部都多了一個 ^M,於是手動刪除幾個 ^M,使呈以下樣子:
northwest NW Charles Main 3.0 .98 3 34**VA** // 手動刪除 ^M 以驗證
western WE Sharon Gray 5.3 .97 5 23**VA** // 同上
southwest SW Lewis Dalsass 2.7 .8 2 18**VA** // 同上
southern SO Suan Chin 5.1 .95 4 15^M**VA** // 保留 ^M 以對比
southeast SE Patricia Hemenway 4.0 .7 4 17^M**VA** // 同上
eastern EA TB Savage 4.4 .84 5 20^M
northeast NE AM Main Jr. 5.1 .94 3 13^M
north &nb12下一頁