Linux 替换^M字符方法
发布日期:2021-10-05 13:28:27 浏览次数:2 分类:技术文章

本文共 1866 字,大约阅读时间需要 6 分钟。

  最近遇到一个通过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种方式显示如下:
  
这里写图片描述 这里写图片描述 这里写图片描述 这里写图片描述

  可能你会问,不就一个换行,怎么搞的这么复杂,感兴趣的同学可以参考文章《 》,你就知道它们的起源了。

  还是回到最开始我们讨论的问题,为什么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文件。

转载地址:https://blog.csdn.net/lml200701158/article/details/52350659 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:深入理解PHP原理之变量声明
下一篇:深入理解PHP原理之静态变量

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月26日 21时16分19秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

python合并列表重新排序_python – 将两个已排序的列表合并为一个更大的排序列表... 2019-04-21
vbs用mysql语句查询数据库_vbs脚本实现window环境下的mysql数据库的备份及删除早期备份... 2019-04-21
mysql连接nginx_nginx四层负载均衡连接mysql 2019-04-21
mysql截取栏目字符_substring从指定字符串开始截取(图) 2019-04-21
python 函数参数前面两个星号_Python中参数前面一个星号两个星号(*参数,**参数)起什么作用呢?... 2019-04-21
python类属性初始化_Python类定义、属性、初始化和析构 2019-04-21
mysql构建url给scrapy_Python Scrapy从mysq填充起始url 2019-04-21
owdcloud mysql_MySQL在Ubuntu远程配置 2019-04-21
python基础装饰器_Python基础 装饰器及练习 2019-04-21
python导出csv不带引号的句子_不带双引号写入CSV文件 2019-04-21
python爬虫代码模板_Python:学习Python爬虫的第一天 2019-04-21
springboot获取原生js请求_springboot跳转原生html 2019-04-21
java buffer nio_Java NIO之Buffer(缓冲区)入门 2019-04-21
android java加密_android 和java平台通用的AES加密解密 2019-04-21
java导出类_java导出excel工具类 2019-04-21
java学习手册下载_Java学习手册 2019-04-21
axios delete有请求体吗_关于axios请求——delete方法 2019-04-21
java 自助更改密码 api_搭建ldap自助修改密码系统--Self Service Password 2021-06-24
php继承exten,stylus中文文档 » 继承(@extend) » 张鑫旭-鑫空间-鑫生活 2021-06-24
mysql函数大全 pdf,MySQL函数大全 2021-06-24