为什么我的Bash脚本将<feff>添加到文件的开头?</feff>

时间:2009-12-29 00:45:41

标签: linux bash sed cp

我编写了一个清理.csv文件的脚本,删除了一些坏的逗号和错误的引号(不好,意味着它们打破了我们用来转换这些文件的内部程序),使用sed:

# remove all commas, and re-insert the good commas using clean.sed
sed -f clean.sed $1 > $1.1st

# remove all quotes
sed 's/\"//g' $1.1st > $1.tmp

# add the good quotes around good commas
sed 's/\,/\"\,\"/g' $1.tmp > $1.tmp1

# add leading quotes
sed 's/^/\"/' $1.tmp1 > $1.tmp2

# add trailing quotes
sed 's/$/\"/' $1.tmp2 > $1.tmp3

# remove utf characters
sed 's/<feff>//' $1.tmp3 > $1.tmp4

# replace original file with new stripped version and delete .tmp files
cp -rf $1.tmp4 quotes_$1

这是clean.sed:

s/\",\"/XXX/g;
:a
s/,//g
ta
s/XXX/\",\"/g;

然后它删除临时文件和中提琴我们有一个新的文件,以“引号”开头,我们可以用于其他进程。

我的问题是:
为什么我必须创建一个sed语句来删除该临时文件中的feff标记?原始文件没有它,但它总是出现在替换文件中。起初我认为cp导致了这一点,但是如果我在cp之前插入sed语句删除它,那就不存在了。

也许我只是错过了一些东西......

2 个答案:

答案 0 :(得分:16)

U + FEFF是byte order mark的代码点。您的文件很可能包含以UTF-16保存的数据,并且BOM已被您的“清理过程”损坏,这很可能是您期望的ASCII。删除BOM可能不是一个好主意,而是首先修复脚本以免损坏它。

答案 1 :(得分:3)

要在GNU emacs中删除这些:

  1. 打开Emacs
  2. 执行find-file-literally打开文件
  3. 编辑前三个字节
  4. 保存文件
  5. 还有一种方法可以将具有DOS行终止约定的文件转换为Unix行终止约定。