• 文件编码与换行问题汇总


    ====================================编码问题====================================

    问题描述

      我自己写了一个Python脚本,在Linux服务器和我的Mac上运行都报错:

    ./build_system.py: line 1: #!/usr/bin/python: No such file or directory

      在网上搜索了半天,发现都说都问题原因是第一行尾部写入了Windows都回车“ ”,导致解析成了“python ”而不是“python”,因而报错是“: No such file or directory”( 符号导致了行开始,覆盖了原来都内容)。从网上都这个解释来看,跟我都这个问题现象不是一样的。更何况,我手动删除第一行,在Linux环境下重写了一遍,还是一样的报错,因此可以证明我遇到的问题并非是“ ”引起的。

    问题分析

      我认为一定是有不可见字符导致的问题。于是,我用Linux命令diff找一个可以运行的Python脚本来对比下头部:

    $ diff ../../unibuild/unibuild.py build_system.py | more
    1c1
    < #!/usr/bin/python
    ---
    > <U+FEFF>#!/usr/bin/python

      果然不出所料,不能运行的脚本文件开头,多了一个不可见内容<U+FEFE>,搜索这个字符发现了问题原因。

    问题原因

      引用网友的描述:

    有些编辑器,比如M$ Windows的记事本,在创建UTF8编码文件时会在头部添加一个不可见字符。这个字符可以通过vim查看到,而且如果是一个php文件,php4、php5在解析时均会有输出。
    原来这个被称作BOM(Byte Order Mark)的不可见字符,是Unicode用来标识内部编码的排列方式的,在UTF-16、UTF-32编码里它是必需的,而在UTF-8里是可选的。因此,才会出现有的编辑器在文件头部添加添加BOM、而有的语法解析器又不作处理的的混乱情况。
    根据w3c里FAQ的建议,解决方法就是,删无赦

      请参考:UTF-8编码中BOM的检测与删除

    问题解决

      用vi编辑器打开出问题的文件,输入如下指令:

    :set nobomb        #删除UTF-8 BOM字符

      反之,如果是保留UTF-8 BOM则输入“:set bomb”.

    ====================================回车问题====================================

    问题描述

      Windows平台下的文件夹共享给了Linux来访问执行,运行脚本的时候报错:

    bash: ./main.py: /usr/bin/python^M: 解释器错误: 没有那个文件或目录

    问题原因

      Windows平台下的回车是 ,但是Linux平台是 ,多出来的 对解释器造成了干扰,需要去掉多余的 符号。

    问题解决

      用sed来处理文本替换问题真的是有奇效!输入如下命令:

    sed -i 's/
    $//' test.sh

    附录帮助

    [root@www ~]# sed [-nefr] [动作]
    选项与参数:
    -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
    -e :直接在命令列模式上进行 sed 的动作编辑;
    -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
    -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
    -i :直接修改读取的文件内容,而不是输出到终端。
    
    动作说明: [n1[,n2]]function
    n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 1020 行之间进行的,则『 10,20[动作行为] 』
    
    function:
    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
    
    --------------------------------------------------------------------
    
    一个例子:
    sed -i 's/原字符串/新字符串/' /home/1.txt
    View Code
  • 相关阅读:
    第19篇-Kibana对Elasticsearch的实用介绍
    第18篇-用ElasticSearch索引MongoDB,一个简单的自动完成索引项目
    第17篇-使用Python的初学者Elasticsearch教程
    第16篇-关于Elasticsearch的6件不太明显的事情
    第15篇-使用Django进行ElasticSearch的简单方法
    第14篇-Python中的Elasticsearch入门
    第13篇-Elasticsearch查询-术语级查询
    第12篇-Elasticsearch全文查询
    MQTT
    rest-framework-@action()装饰器
  • 原文地址:https://www.cnblogs.com/kuliuheng/p/6837423.html
Copyright © 2020-2023  润新知