2011-05-09 43 views
0

我只是找不到我的錯誤刪除CSV文件中的字符...使用SED

我有一個CSV文件用線是這樣的:

11;1116209173900;8;4690;000;ÖBB;20090831;20100330;O603;603-Deutschlandsberg; 

我想在603前刪除O。 我sed的命令如下:

sed 's/\(\(.*;\)\{8\}\)O\(.\{3\}\);/\1\2;/g' 

但我得到的是

11;1116209173900;8;4690;000;ÖBB;20090831;20100330;20100330;;603-Deutschlandsberg; 

哪裏是我的錯?

預先感謝您!

回答

2

只是一個非常小的變化:

sed 's/\(\(.*;\)\{8\}\)O\(.\{3\}\);/\1\3;/' 

你的括號(\(\(.*;\)\{8\}\))兩個層次,即\2包含.*;的最後一場比賽。
順便說一句製造:性能和明確性的原因,我認爲這是更好地使用[^;]*而不是.*

sed 's/\(\([^;]*;\)\{8\}\)O\(.\{3\}\);/\1\3;/' 
+0

我明白了!所以每個'\('得到一個數字變量,對嗎?謝謝! – speendo 2011-05-09 10:12:05

+1

是的,每個'\(* regexp * \)'都會導致從'\ 1'到'\ 9'的變量/反向引用。 – bmk 2011-05-09 10:22:02

+0

just因爲我很好奇:如果你需要超過9個變量,你能做什麼? – speendo 2011-05-09 12:05:27