時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
現(xiàn)象:
按照《Unix shell 范例精解》試 sed 例子,用的是書自帶光盤里的文件 datafile。但是運(yùn)行命令(以兩個數(shù)字結(jié)尾的行,將結(jié)尾兩個數(shù)字 ab 替換為 ab.5 )
> sed 's/[0-9][0-9]$/&.5/' datafile
卻沒有輸出,其中某一行最后數(shù)字是34,把上面 [0-9][0-9]$ 直接換成 34$ 依舊沒有輸出。 讓人一度以為在這個 Ubuntu 上 $ 元字符不能用。但是這是絕對不可能的,這年頭那個敢不支持 POSIX的正則表達(dá)式。
繼續(xù)嘗試這個 $元字符,運(yùn)行例子命令如下(結(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 很可疑,難道是輸出時的覆蓋?因?yàn)闆]有替換這個地方阿,再試試
> sed '/west/,/east/s/$/**VA**/' datafile
輸出如強(qiáng)烈地支持俺地懷疑,如下:
**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#副標(biāo)題#e#
于是來個重定向:
>sed '/west/,/east/s/$/**VA**/' datafile > file
> vim file
顯示每行尾部都多了一個 ^M,于是手動刪除幾個 ^M,使呈以下樣子:
northwest NW? Charles Main? 3.0 .98 3?? 34**VA**????? // 手動刪除 ^M 以驗(yàn)證
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 傳送。這是建議方法是:強(qiáng)行設(shè)定 ftp 方式為 ascii 方式就可以了啊! 當(dāng)然也可以通過軟件 dos2unix 搞定。// 我沒嘗試過哈。
從現(xiàn)象到原因到解決方法如下。備份防遺忘。
Tue,Jan/26/2010
關(guān)鍵詞標(biāo)簽:Unix shell
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實(shí)現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載