文件编码与换行问题汇总

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

问题描述

  我自己写了一个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
原文地址:https://www.cnblogs.com/kuliuheng/p/6837423.html