您的位置 首页 java

Window和Linux的换行符之战

在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,想要快速回到下一行的开头,需要打印两个不可见字符,否则打印可见字符会在纸面上留下污点。

解决换行问题的办法就是:用一个字符<Return>来移到第一列,另一个字符<Line feed>来新增一行,也就是用 “\r\n” 来表示换行。

计算机产生以后,存储较为昂贵,而且换行是个最常见的操作,在如何解决回车换行这个老问题上,人们产生了不同的意见。

Unix 的粉丝认为,到达一行的结尾时新增一个 <Line feed> 来表示换行,即用 “\n” 来表示换行;而Mac的人则认同 <Return> 的解决办法,Window则坚持古老的<Return><Line feed>的方法,延续使用 “\r\n” 来表示换行。

三大操作系统各自为战,谁也不服谁,从而导致了分裂,这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。

由于Windows风格的换行使用 “\r\n” ,如果把这样的文件上传到 Unix/ Linux ,不能识别 “\r” ,所以显示时在行尾会出现 ^M 出来。使用 cat -A 选项查看文本所有的字符,如下所示:

 [ root @ localhost  ~]# cat -A world.sh

[root@localhost ~]# Hello World^M$  

说明一下,cat -A等价于:cat -vE,其命令参数的含义为:

 -v:使用^和M表示不可打印字符

-E:在每行结束处显示$  

备注:很多人误以为$是换行符,其实它不是换行符n的表示。

去除 “^M” 符号,有以下三种最常用的方法:

 (1)cat -A a.txt | tr -d '^M'  > b.txt  

shell 的 tr 命令用于转换或删除文件中的字符。tr 指令从标准 输入设备 读取数据,经过 字符串 转换后,将结果输出到标准输出设备。-d:删除指令字符

 (2)$ dos2unix filename  

此方法是很多人最常用的方法,也是最方便的方法。

 (3)sed -i 's/\r//' world.sh  

备注:内容源自《趣谈shell》,解密Linux江湖故事,用非线性思维学习shell,让天下没有难学的shell。

文章来源:智云一二三科技

文章标题:Window和Linux的换行符之战

文章地址:https://www.zhihuclub.com/182969.shtml

关于作者: 智云科技

热门文章

网站地图