在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,想要快速回到下一行的开头,需要打印两个不可见字符,否则打印可见字符会在纸面上留下污点。
解决换行问题的办法就是:用一个字符来移到第一列,另一个字符来新增一行,也就是用 “\r\n” 来表示换行。
计算机产生以后,存储较为昂贵,而且换行是个最常见的操作,在如何解决回车换行这个老问题上,人们产生了不同的意见。
Unix的粉丝认为,到达一行的结尾时新增一个 来表示换行,即用 “\n” 来表示换行;而Mac的人则认同 的解决办法,Window则坚持古老的的方法,延续使用 “\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。