美文网首页
2019-06-14 Windows Unix OSX各操作系统

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

作者: 四火流年 | 来源:发表于2019-06-15 14:23 被阅读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自动加上的)
    

    相关文章

      网友评论

          本文标题:2019-06-14 Windows Unix OSX各操作系统

          本文链接:https://www.haomeiwen.com/subject/zvumfctx.html