vim 打开文件末尾带有^M的解决办法

一、背景 
昨天写了一个expect脚本用来做 板卡的自动化测试,获取framer设备的link up/down信息 定向到log文件里面。为了方便分析和处理,使用shell 脚本处理这个log文本。 
主要思路是将log中的特定行输出至新的new_log文件,对new_log文件中的词语进行拆分、比较,对设备link up/down 的状态信息进行统计。 
初步写了一个shell脚本后,发现对设备的统计信息明显不对。为了测试程序,伪造了一个log文本,就是自己复制粘贴的数据;处理之后,发现统计信息没什么问题。。继续对源文件进行处理,还是有问题。百思不得其解。。。。 
二:发现问题 
经过伪造的log与new_log的对比分析发现,new_log文本里每行的末尾多了一个^M;利用shell鞋的分词程序发现,这个^M竟然与末尾单词是一个整体,怪不得统计信息有问题;单纯比较字符串的话,肯定是有问题的; 
vim打开 new_log 的显示如下:

 
  1. CPU Normal^M

  2. Framer Host Link Up^M

  3. CPU Normal^M

  4. Framer Host Link Down^M

  •  

分词log如下:

CPU 
Normal^M 
Framer 
Host 
Link 
Up^M

三、解决问题 
发现这个问题之后,就得想办法去除^M 以及找到^M出现的原因; 
经过百度,发现:

 
  1. 1. 在windows下的文本文件的每一行结尾,都有一个回车('\n')和换行('\r')

  2. 2. 在linux下的文本文件的每一行结尾,只有一个回车('\n');

  3. 3. 在Mac下的文本文件的每一行结尾,只有一个换行('\r');

  •  

而在Linux下打开windows编辑过的文件,就会在行末尾显示^M; 
这个^M的在vim下的输入是:

 
  1. ctrl+v <----> ^

  2. ctrl+m <----> M

  • 四:解决方法 

1:首先想到的字符串的替换 
利用VIM的命令行输入:

%s/^M$//g
  •  

解释:% 指匹配整个文件,s 是置换的意思,^M 注意要用 Ctrl + V Ctrl + M 来输入,M 后面的 $ 代表匹配行尾的内容,最后的 g 则表示每行中匹配到的内容都要置换; 
2:dos2unix工具

dos2unix Filename
  •  

3:批量转换

find ./ -type f -print0 | xargs -0 dos2unix
  •  

或者

find ./ -type f print0 | xargs -0 sed -i 's/^M$//'
  •  

即可。 
五:后记 
找到了解决方法,问题自然很快就解决啦。目前自动化脚本运行非常良好。分析结果,很直观。不过,这只是查找问题的第一步。 
BTW,昨天是元宵节,解决完这个问题就直接回去了,今天补充的昨天的记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值