時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
現(xiàn)象:
按照《Unix shell 范例精解》試 sed 例子,用的是書自帶光盤里的文件 datafile。但是運行命令(以兩個數(shù)字結(jié)尾的行,將結(jié)尾兩個數(shù)字 ab 替換為 ab.5 )
> sed 's/[0-9][0-9]$/&.5/' datafile
卻沒有輸出,其中某一行最后數(shù)字是34,把上面 [0-9][0-9]$ 直接換成 34$ 依舊沒有輸出。 讓人一度以為在這個 Ubuntu 上 $ 元字符不能用。但是這是絕對不可能的,這年頭那個敢不支持 POSIX的正則表達式。
繼續(xù)嘗試這個 $元字符,運行例子命令如下(結(jié)尾添加 **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
#p#副標題#e#
于是來個重定向:
>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 NO Margot Weber 4.5 .89 5 9^M
central CT Ann Stephens 5.7 .94 5 13^M
保存推出后 cat file1, 屏幕顯示如下:
northwest NW Charles Main 3.0 .98 3 34**VA**
western WE Sharon Gray 5.3 .97 5 23**VA**
southwest SW Lewis Dalsass 2.7 .8 2 18**VA**
**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
證明猜測正確,只是這個 ^M 是什么東西呢?
原因和解決方法:
Google 之,得說法如下:
Linux編輯器vim中刪除行尾的^M
有時候,在 Linux 中使用打開曾在 Windows 中編輯過的文件時,會在行尾看到 ^M 字符?雌饋砜偸歉杏X很別扭。
刪除方法如下:
在 Vim 的命令模式中輸入 :%s/^M$//g 后,回車即會自動刪除該文件中的所有 ^M 字符。
注意: ^M 要用 Ctrl + v, Ctrl + m 來輸入, 用鍵盤直接敲^和M是不行的! 后面的 $ 代表匹配行尾的內(nèi)容,最后的 g 則表示每行中匹配到的內(nèi)容都要置換--全局替換,否則只替換每行中匹配到的第一個。
又腳本刪除方法:
cat file | col -b > file.1 // 這個可以去掉,但是生成文件里漢字變亂碼
sed -e 's/.$//g' file // 正確
sed ‘s/^M//' file // 正確,但是 ^M = Ctrl + v, Ctrl + m
附錄:^M 另一個會出現(xiàn)的情況是文件在 windows 和 Linux 系統(tǒng)間通過 Ftp 傳送。這是建議方法是:強行設定 ftp 方式為 ascii 方式就可以了啊! 當然也可以通過軟件 dos2unix 搞定。// 我沒嘗試過哈。
從現(xiàn)象到原因到解決方法如下。備份防遺忘。
Tue,Jan/26/2010
關鍵詞標簽:Unix shell
相關閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠程會話GNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠程桌面連
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址linux tc實現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關機、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務器硬盤IO讀寫負載