免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1771 | 回复: 0
打印 上一主题 下一主题

[Sed-Vim]:文件行尾奇怪的^M及解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-26 11:18 |只看该作者 |倒序浏览

                                                                                现象:
[color="#0001FF"]按照《Unix shell 范例精解》试 sed 例子,用的是书自带光盘里的文件 datafile。但是运行命令(以两个数字结尾的行,将结尾两个数字 ab 替换为 ab.5 )[color="#0001FF"]
[color="#FF0102"]> sed 's/[0-9][0-9]$/&.5/' datafile[color="#0001FF"]
[color="#0001FF"]却没有输出,其中某一行最后数字是34,把上面 [0-9][0-9]$ 直接换成 34$ 依旧没有输出。 让人一度以为在这个 Ubuntu 上 $ 元字符不能用。但是这是绝对不可能的,这年头那个敢不支持 POSIX的正则表达式。[color="#0001FF"]
[color="#0001FF"]继续尝试这个 $元字符,运行例子命令如下(结尾添加 **VACA**):[color="#0001FF"]
[color="#0001FF"]> sed '/west/,/east/s/$/**VACA**/' datafile
输出如下:
[color="#000102"]**VACA**t[color="#000102"]        [color="#000102"]NW[color="#000102"]        [color="#000102"]Charles Main[color="#000102"]                [color="#000102"]3.0[color="#000102"]        [color="#000102"].98[color="#000102"]        [color="#000102"]3[color="#000102"]        [color="#000102"]34[color="#000102"]**VACA**   [color="#000102"]        [color="#000102"]WE[color="#000102"]        [color="#000102"]Sharon Gray[color="#000102"]                [color="#000102"]5.3[color="#000102"]        [color="#000102"].97[color="#000102"]        [color="#000102"]5[color="#000102"]        [color="#000102"]23[color="#000102"]**VACA**t[color="#000102"]        [color="#000102"]SW[color="#000102"]        [color="#000102"]Lewis Dalsass[color="#000102"]                [color="#000102"]2.7[color="#000102"]        [color="#000102"].8[color="#000102"]        [color="#000102"]2[color="#000102"]        [color="#000102"]18[color="#000102"]**VACA**[color="#000102"]                [color="#000102"]SO[color="#000102"]        [color="#000102"]Suan Chin[color="#000102"]                [color="#000102"]5.1[color="#000102"]        [color="#000102"].95[color="#000102"]        [color="#000102"]4[color="#000102"]        [color="#000102"]15[color="#000102"]**VACA**t[color="#000102"]        [color="#000102"]SE[color="#000102"]        [color="#000102"]Patricia Hemenway[color="#000102"]        [color="#000102"]4.0[color="#000102"]        [color="#000102"].7[color="#000102"]        [color="#000102"]4[color="#000102"]        [color="#000102"]17[color="#000102"]eastern[color="#000102"]                [color="#000102"]EA[color="#000102"]        [color="#000102"]TB Savage[color="#000102"]                [color="#000102"]4.4[color="#000102"]        [color="#000102"].84[color="#000102"]        [color="#000102"]5[color="#000102"]        [color="#000102"]20[color="#000102"]northeast[color="#000102"]        [color="#000102"]NE[color="#000102"]        [color="#000102"]AM Main Jr.[color="#000102"]                [color="#000102"]5.1[color="#000102"]        [color="#000102"].94[color="#000102"]        [color="#000102"]3[color="#000102"]        [color="#000102"]13[color="#000102"]north[color="#000102"]                [color="#000102"]NO[color="#000102"]        [color="#000102"]Margot Weber[color="#000102"]                [color="#000102"]4.5[color="#000102"]        [color="#000102"].89[color="#000102"]        [color="#000102"]5[color="#000102"]        [color="#000102"] 9[color="#000102"]central[color="#000102"]                [color="#000102"]CT [color="#000102"]        [color="#000102"]Ann Stephens[color="#000102"]                [color="#000102"]5.7[color="#000102"]        [color="#000102"].94[color="#000102"]        [color="#000102"]5[color="#000102"]        [color="#000102"]13
[color="#0001FF"]觉得 **VACA**t 后的那个 t 很可疑,难道是输出时的覆盖?因为没有替换这个地方阿,再试试[color="#0001FF"]
[color="#FF0102"]> sed '/west/,/east/s/$/**VA**/' datafile[color="#0001FF"]
[color="#0001FF"]输出如强烈地支持俺地怀疑,如下:
**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        17eastern                EA        TB Savage                4.4        .84        5        20northeast                NE        AM Main Jr.                        5.1        .94        3        13north                NO        Margot Weber                4.5        .89        5         9central                CT         Ann Stephens                5.7        .94        5        13
[color="#0001FF"]于是来个重定向:[color="#0001FF"]
[color="#FF0102"]>sed '/west/,/east/s/$/**VA**/' datafile > file[color="#FF0102"]> vim file[color="#0001FF"]
[color="#0001FF"]显示每行尾部都多了一个 ^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^Mnortheast       NE  AM Main Jr.     5.1 .94 3   13^Mnorth             NO  Margot Weber        4.5 .89 5    9^Mcentral           CT  Ann Stephens        5.7 .94 5   13^M
[color="#0001FF"]保存推出后  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        17eastern                EA        TB Savage                4.4        .84        5        20northeast                NE        AM Main Jr.                5.1        .94        3        13north                        NO        Margot Weber                4.5        .89        5         9central                CT         Ann Stephens                5.7        .94        5        13
[color="#0001FF"]证明猜测正确,只是这个 ^M 是什么东西呢?
[color="#0001FF"]原因和解决方法:
Google 之,得说法如下:
Linux编辑器vim中删除行尾的^M有时候,在 Linux 中使用打开曾在 Windows 中编辑过的文件时,会在行尾看到 ^M 字符。看起来总是感觉很别扭。删除方法如下:在 Vim 的命令模式中输入 :[color="#FF0102"]%s/^M$//g 后,回车即会自动删除该文件中的所有 ^M 字符。注意: ^M 要用 Ctrl + v,  Ctrl + m 来输入, 用键盘直接敲^和M是不行的! 后面的 $ 代表匹配行尾的内容,最后的 g 则表示每行中匹配到的内容都要置换--全局替换,否则只替换每行中匹配到的第一个。
[color="#FF0102"]又脚本删除方法:[color="#FF0102"]cat file | col -b > file.1  // 这个可以去掉,但是生成文件里汉字变乱码
sed -e 's/.$//g'  file       // 正确
[color="#FF0102"]sed ‘s/^M//' file           // 正确,但是 ^M = Ctrl + v, Ctrl + m
附录:^M 另一个会出现的情况是文件在 windows 和 Linux 系统间通过 Ftp 传送。这是建议方法是:强行设定 ftp 方式为 ascii 方式就可以了啊! 当然也可以通过软件 dos2unix 搞定。// 我没尝试过哈。
从现象到原因到解决方法如下。备份防遗忘。
Tue,Jan/26/2010
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/111146/showart_2160691.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP