2019-06-14 Windows Unix OSX各操作系统

2019-06-15  本文已影响0人  四火流年

Unix、Windows、OSX系统下的换行符

Windows系统下,换行是<回车换行>(Carriage Return and Line Feed,即 CRLF):

  1. CR - \r,在ASCII字符表里的编号是13,用二进制表示即 0x0d
  2. LF - \n,在ASCII字符表里的编号是10,用二进制表示即 0x0a

Unix系统,采用的是 LF 作为换行符。

Mac系统曾经使用过 CR 作为换行符,但是在 Mac OS X 之后,又换为了LF。

  1. Command-line tools in OS X (and other UNIX or Linux variants) use UNIX-style line endings. This means that each line in a text file ends with a newline character (character 10/0xA, often abbreviated LF).
  2. Many older Mac applications use "Mac-style” line endings. This means that each line in a text file ends with a carriage return character (character 13/0xD, often abbreviated CR).

以上摘自Designing Scripts for Cross-Platform Deployment

如何查看换行符

使用xxd命令可以查看二进制文件,从而可以看出文件的换行符是\r、\n、还是\r\n。

~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a            abc.def.ghi.

可以看出该文件的换行符是 LF, 即0a、\n

注:当前系统是OS X,上面以及下面的测试都是在该环境下进行的。

VIM下切换换行符

Vim 可以通过set ff=mac|unix|dos的方式进行换行符的切换。

切换成Mac系统

~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a            abc.def.ghi.
~ vim /tmp/aaaa (执行命令 :set ff=mac,)
~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d            abc.def.ghi.

切换成Dos系统

~ cat /tmp/aaaa
abc
def
ghi
~ xxd /tmp/aaaa
00000000: 6162 630a 6465 660a 6768 690a            abc.def.ghi.
~ vim /tmp/aaaa (执行命令 :set ff=mac,)
~ xxd /tmp/aaaa
00000000: 6162 630d 0a64 6566 0d0a 6768 690d 0a    abc..def..ghi..

换行符不同会带来的问题

以换行符CR为例:

用VIM打开换行符为CR的文件

当前系统是OS X,使用的是Unix模式,所以是以LF作为换行符,在查不到该字符的情况下,也就不会换行,所以看起来像是只有一行。


VIM打开CR为换行符的文件.png

输入^M这个符号的方式是:Ctrl V + Ctrl M

对文件的处理

~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d            abc.def.ghi.
~ cat /tmp/aaaa
~ wc /tmp/aaaa
        0       3      12 /tmp/aaaa
~ wc -l /tmp/aaaa
        0 /tmp/aaaa

cat命令无法正确打印出该文件的内容,wc -l命令也无法正确打印出该文件的行数。

此外,很多程序在处理文件时,都默认以LF做为换行符,那么在读取文件时,如果一直扫描不到LF,那么就无法解析和结束。
总结此篇分享的原因就是,在使用logstashsplit插件处理以CR为换行符的文件时,程序会卡住。

注意:
Vim保存文档时会自动在结尾加上0a
在测试环境调试split时,我用“截短后的原始数据”,调试成功。
但是实际上,这样的数据和真正的原始数据是不一样的,导致用split处理真正的数据时卡住了。

~ xxd /tmp/aaaa
00000000: 6162 630d 6465 660d 6768 690d            abc.def.ghi.
~ vim /tmp/aaaa (在最前头增加一个 a,然后保存退出)
~ xxd /tmp/aaaa
00000000: 6161 6263 0d64 6566 0d67 6869 0d0a       aabc.def.ghi..
(最后面多了一个0a,这就是Vim自动加上的)
上一篇下一篇

猜你喜欢

热点阅读