2015-07-10 3 views
1

Итак, я просмотрел другие вопросы, и ничего конкретного, похоже, не может мне помочь. У меня есть файл с переменной даты, установленной как mm/dd/yyyy, которую я хотел бы заменить датой.Дата замены Sed

Например:

version.js

//Application Version Information 
app_date="7/07/2015"; 
... 

И я хотел бы использовать СЭД, чтобы заменить его. У меня на самом деле есть сценарий оболочки, который заменяет многие вещи в этом файле, и все работают за исключением даты. В настоящее время я пытаюсь:

sed -i -e 's:app_date="[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]":app_date="$(date %m/%d/%Y)":g' 

Но это не дает мне результатов, которые я хочу. Я также пробовал:

sed -ibak 's/app_date=\"[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]\"/app_date=\$(date +%m/%d/$Y)\"/g' 

Ничего не работает.

Любые идеи?

Edited добавить:

Решение Я успешно используется Шон Брайта с двойными кавычками:

sed -i -e "s:app_date=".*";:app_date="$(date +%m/%d/%Y)";:g" version.js 

Это прекрасно работает для моих потребностей.

+0

Каков ваш ожидаемый результат? – anubhava

+1

ваше значение «день» '7 /' не будет соответствовать вашему регулярному выражению '[0-9] [0-9] /' Также используйте формат YYYY-MM-DD для дат файла, и они будут сортироваться автоматически в 'ls' листинг. Удачи. – shellter

+0

Общее правило регулярных выражений - «не пересобираться». Поэтому см. Обновленную вторую часть ответа Шона Брайта о том, как избежать совпадения вещей, которые вам не нужны. –

ответ

2

Держу пари, ваш сценарий будет работать, если дата вы соответствие был 10 октября ...

sed -i -e 's:app_date="[0-9][0-9]*/[0-9][0-9]*/[0-9][0-9][0-9][0-9]":app_date="$(date %m/%d/%Y)":g' 

Добавьте * с после вашего дня и месяца выражений, как описано выше. [0-9][0-9] не будет соответствовать 7.

Теперь, когда я думаю об этом, потому что вы не заботитесь о дате, которая уже есть в файле, большинство это не нужно, вы можете просто сделать:

sed -i -e 's:app_date=".*";:app_date="'$(date +%m/%d/%Y)'";:g' version.js 
+0

У вас есть причина сохранить удвоенные диапазоны вместо использования '[0-9] \ +'? –

+0

Для 'sed'? Да. Для 'sed -r'? Нет. Это диалектное выражение. –

+0

Шон, это здорово. Однако теперь он заменяет дату «$ (date% m /% d /% Y)» вместо того, чтобы преобразовать ее в сегодняшнюю дату. Нужно ли мне избегать цитат, а затем вызывать дату? – tadamhicks

1

Вы используете неправильные кавычки оболочки. замена команды $() не будет расширяться внутри одинарных кавычек.

sed -i "/^app_date=/capp_date=\"$(date +%m/%d/%Y)\";" version.js # GNU only 

Другой подход, с помощью файла редактора вместо редактора потока:

ed -s version.js << EOF 
/^app_date=/c 
app_date="$(date +%m/%d/%Y)"; 
. 
w 
EOF 
1

Для замены даты с чем в Linux

n=`date +%d` 

cal>temp 

If [$n -lt 10] 

//10 is just a predction for condition 


then 

Sed s/"$n"/*/g temp 

else 

Sed s/"$n"/**/g temp 

fi 

// s является текст подставляя вариант // * - это все, что заменяет дату // g является глобальной заменой

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