Linux 替换^M字符方法

原创 2016年08月29日 10:13:11

  最近遇到一个通过windows上传文本数据到linux服务器,但是读取数据文件时,因为每行数据后面出现^M字符,导致通过程序读取数据失败,希望把^M字符替换成换行字符,所以对这一块仔细研究了下。网上的方法很多,也很杂,有很多网友都说通过dos2unix就可以搞定,其实在有些情况下,这个命令是行不通的,具体原因待会再说,下面讲述一个通过linux命令处理的通用方法(为什么强调linux命令?因为待会我会给出一个通过程序处理的方法):

$ sed -i 's/^M/\n/g' myfile.txt
//注意:这里的“^M”要使用“CTRL-V CTRL-M”生成,而不是直接键入“^M”

  强调一下,命令中的^M不是直接输入^和M哈,是在linux中敲“CTRL-V CTRL-M”生成的,这个需要注意,因为在linux下^M其实是一个字符,你如果直接敲^和M,那就是2个字符了,然后意义也完全不一样。
  可能你会问,我可以通过dos2unix命令搞定啊:

$ dos2unix myfile.txt

  是的,这种方式的确可以解决大部分问题,但有时也解决不了,为什么?这个需要讲述windows、linux和OS换行符的不同标准,不过在讲该标准前,需要明确几个概念:
  回车:用“\r”表示,ASCII码中的“代码”为CR,意义是将光标移到当前行的首位;
  换行:用“\n”表示,ASCII码中的“代码”为LF,意义是将光标移到下一行。
  ASCII码可以参考下图:
  这里写图片描述
  
  下面直接上干货,windows、linux、mac系统的换行符:
  (1) DOS/Windows系统采用CRLF(回车+换行)表示下一行,即“\r\n”;
  (2) Linux/UNIX系统采用LF表示下一行,即“\n”;
  (3) MAC系统采用CR表示下一行,即“\r”;
  可能你会问,我怎么知道我的文本数据结尾是哪种,有没有什么工具可以显示出来?当然可以,用Notepad++,点击菜单中Edit->EOL Conversion,会展开Windows Format、UNIX/OSX Format、Old Mac Format这3中转换格式,具体意义通过名字很简单理解,下面让我们看看这3中格式的数据在Notepad++中是如何显示的,原数据和通过3种方式显示如下:
  
这里写图片描述 这里写图片描述 这里写图片描述 这里写图片描述

  可能你会问,不就一个换行,怎么搞的这么复杂,感兴趣的同学可以参考文章《DOS、Mac 和 Unix 文件格式 》,你就知道它们的起源了。
  还是回到最开始我们讨论的问题,为什么linux数据出现^M,用命令dos2unix有时行不通,如果你的数据结尾是CRLF,即windows类的数据,这个当然没有问题,但如果结尾是CR,用dos2unix就行不通了,因为dos2unix命令用来将DOS/Windows格式的文本文件转换成UNIX格式的,CR是Mac格式,那怎样将Mac格式数据转成Linux呢?用命令mac2unix即可:

$ mac2unix myfile.txt

  如果想逆转,也有对应的命令unix2dos、unix2mac,是不是很简单呢,哈哈~~
  上面讲述的是“不同系统换行符基本原理”和“通用linux解决^M问题”,其实很多时候我们需要通过程序来处理,例如通过windows或Mac文件上传到linux服务器,然后在linux服务器上通过程序读取文件,这时就会遇到换行符问题,那么怎样通过程序来解决呢?下面是通过PHP语言,然后结合AWK方式处理:

$fileFullName = './myfile.txt';
$tmpFile = './temp.txt';
$cmd = "cat {$fileFullName}|awk -F\"[\r\n]\" '{for(i=1;i<=NF;i++)if(\$i!~/^$/)print \$i}' > {$tmpFile};mv {$tmpFile} {$fileFullName}";
shell_exec($cmd);

  可能大家对AWK不熟,我解释一下吧,前两行是定义文件(最好写全路径,我这里只是演示),第三行是通过awk处理文件的命令:将文件fileFullName每行按照分隔符“\r”和“\n”进行分割,分割后的数据,通过“i!~/^$/”判断非空,然后将非空的数据导入tmpFile,数据全部处理完后,用tmpFile文件覆盖fileFullName文件。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux 替换^M字符 方法

替换^M字符 在Linux下使用vi来查看一些在Windows下创建的文本文件,有时会发现在行尾有一些“^M”。有几种方法可以处理。 1.使用dos2unix命令。一般的分发版本中都带有这个小工具...

linux中批量替换文本中字符串

(一)通过vi编辑器来替换。 vi/vim 中可以使用 :s 命令来替换字符串。 :s/well/good/ 替换当前行第一个 well 为 good :s/well/good/g 替换当前行所...
  • zj0910
  • zj0910
  • 2013年10月19日 12:56
  • 19016

Linux 下各种查找替换字符串的办法

1、在vi中使用的查找替换方法利用 :s 命令可以实现字符串的替换。具体的用法包括::s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1:s/str1/str2/g 用字...
  • ak_2005
  • ak_2005
  • 2010年08月02日 09:47
  • 10622

linux/mac批量替换文件中的^M换行符

linux/mac批量替换文件中的^M换行符
  • LRita
  • LRita
  • 2016年09月30日 17:02
  • 3981

删除linux文件行尾^M

今天用WinSCP修改了管理机linux系统下的一个文件,结果重启以后就连不上管理机了!!!无奈用DEBUG口进去,ifconfig一看,咋,我改好的网址都没有了,重启网络服务也没有用。 于是cat...

Linux/Unix下去除windows下换行符^M

Windows下保存的文本文件,上传到Linux/Unix下后总会在末尾多了一个换行符^M,导致一些xml、ini、sh等文件读取错误,下面介绍几种方法解决此类问题: 一、使用vi编辑器,vi是类U...

Linux/Unix下去除window下换行符^M

原文链接:http://jie-hui-520.blog.163.com/blog/static/600743012010111323911518/ 2010-12-13 14:45:20|  ...

vi/vim显示中文字符并且去掉^M的方法

vim上经常会碰到中文显示不正常的现象,也就是传说中的乱码。搜索了一下,在  http://www.chinalinuxpub.com/bbs/showthread.php?t=45475 找到了...

linux下使用vim编辑文本文件时显示^M的解决办法

       有时候在windows下编写的python脚本在linux下不能运行,就是因为^M的原因,因为windows下行结束符是/r/n,而liinux只需要/n. 我们可以使用cat –v来显...
  • pendle
  • pendle
  • 2010年09月17日 11:07
  • 7215

sed替换^M为回车

sed -e 's/^M/\n/g' myfile.txt 注意   ^M 使用“CTRL-V CTRL-M”生成,而不是直接键入“^M”。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 替换^M字符方法
举报原因:
原因补充:

(最多只允许输入30个字)