2016-03-17 4 views
0

У меня есть следующая строка в файле: «dd/mmm/YYYY: HH: MM: SS -0500» и хотела бы, чтобы ее заменили на фактическую дату, т.е. «17/мар/2016: 18: 14: 40 -0500"заменить строку специальными символами с помощью sed

Я попытался с помощью СЭД, но следующий не похоже на работу

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500" 
actualDate="17/Mar/2016:18:14:40 -0500" 
sed -i "s#'$dateTemplate'#'$actualDate'#g" tmp.txt 

Любая помощь будет оценена.

ответ

1

Попробуйте удалить одиночные кавычки (') из программы sed:

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500" 
actualDate="17/Mar/2016:18:14:40 -0500" 
sed -i "s#$dateTemplate#$actualDate#g" tmp.txt 

Испытано с GNU SED версии 4.2.1

До:

1. pre dd/mmm/YYYY:HH:MM:SS -0500 post 
2. pre dd/mmm/YYYY:HH:MM:SS -0500 post 

После:

1. pre 17/Mar/2016:18:14:40 -0500 post 
2. pre 17/Mar/2016:18:14:40 -0500 post 
+0

Это сработало! благодаря!! – jb26

0

EDIT: Я заметил, что вы использовали другой разделитель. Я могу подтвердить, что Майкл Джарос - более точный ответ.

Вам нужно будет избежать косой черты:

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500" 
actualDate="17\/Mar\/2016:18:14:40 -0500" 
sed -i "s/$dateTemplate/$actualDate/g" tmp.txt 

Я проверил, что работает. Дайте мне знать, если это не так!

0

Я бы автоматизировать этот процесс немного:

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500" 

actualDateTemplate="+$(
    sed ' 
     s/\<dd\>/%d/g 
     s/\<mmm\>/%b/g 
     s/\<YYYY\>/%Y/g 
     s/\<HH\>/%H/g 
     s/\<MM\>/%M/g 
     s/\<SS\>/%S/g 
     # add more translations here if desired 
    ' <<<"$dateTemplate" 
)" 

actualDate=$(date "$actualDateTemplate") 

echo "foo $dateTemplate bar" | sed "s#$dateTemplate#$actualDate#g" 
foo 17/Mar/2016:20:22:34 -0500 bar 

Там всегда существует опасность, что переменная dateTemplate будет содержать символ, используемый в качестве s/// разделителем, независимо от того, какой символ вы используете. Этот процесс можно выполнить с помощью строковых операций в оболочке, но это утомительно.

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