2011-05-09 3 views
0

Я просто не могу найти свою ошибку ...удалить символ внутри файла CSV, используя SED

У меня есть CSV-файл с линиями, как это:

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

Я хотел бы удалите O перед 603. Моя СЭД команда выглядит следующим образом:

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 содержит последний матч .*;.
Btw .: В целях повышения производительности и однозначность я думаю, что лучше использовать [^;]* вместо .*:

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

я вижу! Таким образом, каждый '\ (' получает пронумерованную переменную, правда? Спасибо! – speendo

+1

Да, каждый '\ (* regexp * \)' приведет к указанию переменной/обратной ссылки от '\ 1' до' \ 9'. – bmk

+0

просто потому что мне любопытно: что вы можете сделать, если вам нужно больше 9 переменных? – speendo

Смежные вопросы