2009-12-29 40 views
11

我已经写了清理的.csv文件,删除一些不好的逗号和坏的报价脚本(坏,意味着它们在内部程序打破了我们用来把这些文件)使用SED:为什么我的Bash脚本将<feff>添加到文件的开头?

# 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造成了这种情况,但是如果我在sep语句中删除cp之前,它不在那里。

也许我只是失去了一些东西......

+0

请发布'clean.sed'源代码。 .tmpX文件中的哪一个首先出现在? – wallyk 2009-12-29 00:52:40

+2

0xfeff是unicode字节顺序标记。不知道是什么增加了你的情况。 – Eugene 2009-12-29 00:55:46

+2

第一个问题:为什么您创建4个临时文件来完成此操作,而不是每次在$ 1.1st上使用就地(sed -i)? 第二:字节顺序标记(feff)何时开始出现在您的进程中?运行clean.sed后立即出现吗?如果是这样,您可能需要发布该脚本。 第三[nitpick]:当你在单引号内时,你不需要使用双引号,而且你也不需要转义逗号。 's /,/“,”/ g'比'/ \,/ \“\,\”/ g'更具可读性。 – glomad 2009-12-29 00:58:01

回答

15

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

+0

这也是我的想法,但他在问题中明确指出BOM不在原始文件中 – glomad 2009-12-29 01:03:09

+0

一个BOM是不可见的。我最好的猜测是,在问题中的信息是,clean.sed脚本将不可打印的字符更改为它们的十六进制表示,并且还可能删除NUL字符。因此,BOM可能一直存在,它变得更加可见在“清洁”之后。 – 2009-12-29 01:07:03

+0

这里是干净的: s/\“,\”/ XXX/g; :a s /,// g ta s/XXX/\“,\”/ g; – SDGuero 2009-12-29 01:12:15

2

要在GNU Emacs的摆脱这些:

  1. 打开Emacs的
  2. 做一个查找文件,从字面上来打开文件
  3. 编辑关闭领先三个字节
  4. 保存文件

还有一种方法可以将具有DOS行终止约定的文件转换为Unix行终止约定。

+0

在Emacs的'C-x RET f'中指定'utf-8' – 2016-02-02 12:06:55

相关问题