Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467941
  • 博文数量: 118
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1233
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-24 22:11
文章分类

全部博文(118)

文章存档

2013年(5)

2011年(61)

2010年(52)

分类: Python/Ruby

2011-04-14 15:45:18

首先说说^M的产生,我刚才刻意的尝试去制造^M
所以在,window下开了记事本来建立文本文件
但是,拖到linux下,并没有发现^M,这怎么办呢
于是,用了另外一个编辑器,edit,结果怎么样呢?
还是没有出现^M,想到^M的产生实际上是因为dos和
linux 采用了不同的换行导致的,linux是用的\n
而dos是用的\n\r,于是就产生了一个好想法,这
个问题,就可以写个简单的程序来解决了,呵呵
下面是我的C语言代码,dosedit

  1. #include<stdio.h>
  2. int main(){
  3.     char line[100];
  4.     FILE *fp = fopen("a.dos","w");
  5.     do{
  6.     printf("Please Enter a line(\"BYE\" to end input):");
  7.     gets(line);
  8.     fprintf(fp,"%s\r\n",line);
  9.     }while(!(line[0] == 'B' && line[1] == 'Y' && line[2] == 'E'));
  10.     fclose(fp);
  11.     return 0;

  12. }


运行这个程序dosedit后,就会在目录下出现一个a.dos的文件,
这样,我们就有了a.dos这个文件,用记事本打开看看,发现不了什么区别,

然后用vim打开看看,打开一看,耶
出现了,^M出现了,也就是说^M代表\r,呵呵

下面是perl版的程序dosedit.pl
  1. #!/usr/bin/perl
  2. open WH,">a.dos" or die "$!";
  3. my $line = "";
  4. do{
  5. print "Please enter a line(\"BYE\" to end):";
  6. $line = <STDIN>;
  7. chomp $line;
  8. print WH $line."\r\n";
  9. }while($line ne 'BYE')
  10. close WH or die "$!";


在windows下运行的时候,是会出现^M的,但是放到linux下跑的时候白搭,
猜测可能是linux下\r的解释就是回车,然后,这样我们的材料就全了,然后,我就要
开始我的主要目的了,我们可以用dos2unix来把\r去掉,也可以用sed
顺便说说vi的几个比较方便的命令,:sp file 打开文件split screen
切换使用Ctrl-w j|k,就说这么多废话吧,呵呵
我们可以使用dos2unix a.dos
还可以使用sed -e 's/^M//g' a.dos > a.unix

这都不是重点,我要说的是用perl 怎么达到这个效果呢?
  1. perl -ne 's/^M//g; print;' a.dos >a.unix

这样,我们就把^M去掉了,就可以进行下一步的处理了,呵呵

如图所示:


阅读(3156) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

neobilly2011-04-14 16:04:59

^M的输入方式Ctrl-v Ctrl-m