关闭

Windows和Linux换行规则的区别

发表于:2014-6-10 10:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:linuxnote    来源:51Testing软件测试网采编

 补充:sed对windows换行符的处理
  通过上面可以知道vim对于一个全部使用windows格式换行符的文本文件会以[dos]模式来显示这个文本,自动忽略行尾的^M.
  博主在使用sed命令处理一些文件时,会出现一个本来显示正常的文件,被sed处理之后,再打开文件时发现再次出现讨厌的^M. 那么sed是如何处理windows换行符的文本呢?
  先在windows下创建一个文本文件,传至我的linux中。用cat -A 显示特殊字符:
  这里看到最后一行没有换行符,其他行的换行符为^M$, 使用sed处理这个文本文件,向第二行添加一些内容,再用cat -A查看:
  这里我用.*匹配第二行的所有内容,&表示匹配到的所有内容,在&后面我加上了一些内容,用cat -A查看发现,sed在处理替换时,如果匹配到整个行,那么匹配的内容是除了换行符$(Linux 换行符)外的所有内容,即使这个文本的换行符是^M$(windows 换行符).
  因此第二行的文本被sed处理后,^M被我的正则表达式.*当作文本内容而匹配到了,而$不会被匹配,永远在行的末尾充当换行符,这样一来^M和$就被拆散了。因此这一行的换行符在处理后成为了linux格式的换行符$. 用vim打开的效果如下:
  因为文件的换行符是linux和windows混杂的,vim以unix文件格式显示这个文件,文件的^M被显示出来,并且第二行的^M被sed匹配到,因而不在行尾。vim下方的[noeol]原因是最后一行在windows下没有换行符,因此也没有^M.
  得出结论:sed会把文件中的^M当作文件内容来处理,因此如果用sed处理windows下创建的文本文件,很有可能在处理之后显示时出现讨厌的^M. 关于其他的文本处理器如何处理windows的换行符,还有待进一步研究。
  在补充:用cat显示文本时windows与linux换行符的处理
  还是上面的文件,在使用sed命令替换之后用cat -A查看文件内容:
  发现第二行的内容和预想的不一样,我明明是在文件末尾加上的" hello"这个字符串,为什么跑到文件开头了呢,而且还覆盖了原来的字符。
  第二行原来的内容是这样的(红色为特殊字符):
  My name is Liao^M hello$
  前面说过,^M这个特殊字符(注意这是一个特殊字符而不是两个)所代表意义是回车(Carrige Return). cat在显示第二行内容的时候从第二行的开头开始读取字符并输出到屏幕上,当读取到^M这个特殊字符时,将这个特殊字符的意义理解为最原始回车,打字机时代,回车表示机头回到一行的开头(注意只是回到当前行开头,换行的意义才是移动到下一行),因此cat会回到行的开头开始输出字符到屏幕,后面的字符被显示到了这一行开头,这样就会把原本这一行开头的字符覆了。当打印到这一行的末尾时,读取到了$linux换行符,然后换下一行行头开始读取和输出字符。这样就造成了第二行显示时的奇怪现象。
43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号