2016-09-26 6 views
1

У меня есть большой файл (100M строк) в следующем формате:Заменить Пробела с СЕПГОМ

Week  |ID   |Product |Count  |Price 
---------- ------------- -------- ---------- ----- 
2016-01-01|00056001  |172  |23  |3.50 
2016-01-01|1   |125  |15  |2.75 

Я пытаюсь использовать СЕПГ добавить Xs к пропущенным цифрам на втором идентификаторе клиента, но сохранить количество пробелов после полного ID. Таким образом, таблица будет выглядеть следующим образом:

Week  |ID   |Product |Count  |Price 
---------- ------------- -------- ---------- ----- 
2016-01-01|00056001  |172  |23  |3.50 
2016-01-01|1XXXXXXX  |125  |15  |2.75 

Я попытался

sed -i "s/\s\{29,\}/XXXXXXX      /g" *.csv 

и

sed -i -- "s/1        /1XXXXXXX      /g" *.csv 

Ни с каких-либо изменений в файл. Что мне не хватает?

Спасибо.

EDIT для разъяснения: Есть 29 пробелов после 1 в фактических данных. Я использовал меньше в таблице примеров для удобства чтения. Я предполагаю, что любое решение будет применяться независимо от количества пробелов.

+0

Вы уверены, что опция «-i» sed означает «на месте»? На некоторых системах это означает что-то еще, что путает. –

+0

Это означает на месте, когда я использую его для своих типичных процедур замены (я должен запускать определенную командную строку один раз в месяц по некоторым данным, которые мы получаем) ... -i всегда заменяет inline для меня – datahappy

+0

Кроме того, я попробовал -e просто потому, что я видел это для такого типа вещей. Я закончил с линиями 100M, прокручивающимися по моему командному окну :) – datahappy

ответ

2

Это работает для меня (не используя \s, а всего лишь пространство, и бросил бесполезный g вариант, потому что нужно один раз в каждой строке только):

sed -i "s/[ ]\{29,\}/XXXXXXX      /" *.csv 

Хотя по соображениям безопасности я предпочел бы использовать более ограничительный сценарий, который будет выполнять замену только в том случае, если встречается |1:

sed -i "s/\(\|1\)[ ]\{29,\}/\1XXXXXXX      /" *.csv