2014-09-12 4 views
1

Я делаю некоторые очистки данных, и мне нужно, чтобы запустить скрипт Баш, который в основном делает:команда замены, если условия

  • Заменить каждый: с ":"

Я сделал это с sed -i -e 's/:/":"/g' файла

Проблема в том, что это должно выполняться для каждого вхождения в строке, если это не данные времени.

Например, если моя линия

VolumeId:vol-c29a6e96, Size:8, timestamp:Thu Jan 09 13:44:02 UTC 

Я хочу, чтобы это было

VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 

, так что я не хочу, чтобы СЭД команду, которая будет применяться каждый раз, когда данные в виде цифр : digit Как это сделать? (Нет необходимости быть необходимо СЭД команда)

Спасибо за вашу помощь

ответ

1

Другая команда Perl,

$ perl -pe 's/\d{2}:\d{2}:\d{2}(*SKIP)(*F)|:/":"/g' file 
VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 

\d{2}:\d{2}:\d{2}(*SKIP)(*F)|: Это будет полностью пропускает все строки временных меток и соответствует : из remaini ng строк. Просто заменив сопоставленный : на ":", вы получите желаемый результат.

+0

+1 с оговорками для опираясь на экспериментальные особенности perl regexes –

+0

выбор этого ответа, так как он решил мою проблему. – luca

0

Поскольку вы открыты для не SED вариант здесь один вариант использования perl (благодаря поддержке опережения):

s='VolumeId:vol-c29a6e96, Size:8, timestamp:Thu Jan 09 13:44:02 UTC' 
perl -pe 's/(?<=\D):|:(?=\D)/":"/g' <<< "$s" 
VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 
0

СЭД Ответ: изменить колонов в метку времени в какой-то другой символ, заменить все двоеточие, а затем восстановить двоеточия в отметками времени

echo "VolumeId:vol-c29a6e96, Size:18, timestamp:Thu Jan 09 13:44:02 UTC" | 
sed -r ' 
    s/([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})/\1T\2T\3/g 
    s/:/":"/g 
    s/([[:digit:]]{2})T([[:digit:]]{2})T([[:digit:]]{2})/\1:\2:\3/g 
' 
VolumeId":"vol-c29a6e96, Size":"18, timestamp":"Thu Jan 09 13:44:02 UTC 
Смежные вопросы