2009-12-29 36 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

相關問題