我已經寫了清理的.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