20

我编写了一个脚本来清理 .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;

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

我的问题是:
为什么我必须使用 sed 语句来删除该临时文件中的 feff 标签?原始文件没有它,但它总是出现在替换中。起初我以为是 cp 造成的,但如果我在 cp 之前放入 sed 语句来删除,它就不存在了。

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

4

2 回答 2

19

U+FEFF 是字节顺序标记的代码点。您的文件很可能包含以 UTF-16 保存的数据,并且 BOM 已被您的“清理过程”损坏,这很可能需要 ASCII。删除 BOM 可能不是一个好主意,而是首先修复您的脚本以不破坏它。

于 2009-12-29T00:54:38.037 回答
4

要在 GNU emacs 中摆脱这些:

  1. 打开 Emacs
  2. 执行 find-file-literally 打开文件
  3. 编辑掉前三个字节
  4. 保存文件

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

于 2012-04-22T21:22:09.010 回答