我已经写了清理的.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之前,它不在那里。
也许我只是失去了一些东西......
请发布'clean.sed'源代码。 .tmpX文件中的哪一个首先出现在? – wallyk 2009-12-29 00:52:40
0xfeff是unicode字节顺序标记。不知道是什么增加了你的情况。 – Eugene 2009-12-29 00:55:46
第一个问题:为什么您创建4个临时文件来完成此操作,而不是每次在$ 1.1st上使用就地(sed -i)? 第二:字节顺序标记(feff)何时开始出现在您的进程中?运行clean.sed后立即出现吗?如果是这样,您可能需要发布该脚本。 第三[nitpick]:当你在单引号内时,你不需要使用双引号,而且你也不需要转义逗号。 's /,/“,”/ g'比'/ \,/ \“\,\”/ g'更具可读性。 – glomad 2009-12-29 00:58:01