2013-02-19 4 views
1

Я бы хотел использовать Sed, чтобы найти в файле template.php фрагмент временной метки unix имени JS-файла и заменить его текущей меткой времени. Старая временная метка будет меняться, поэтому мне нужно, чтобы регулярное выражение соответствовало числу.Использование Sed для замены старой метки времени текущей

Вот что я до сих пор:

TimPeterson$ current_timestamp=date +%s 
TimPeterson$ sed -i "" "s/myJS-[0-9]*\([0-9]\+\).js/myJS-$current_timestamp.js/" template.php 

Просто чтобы быть ясно, о проблеме, что мне нужно, чтобы соответствовать в имени файла JS выглядит примерно так (где номер детали переменно):

myJS-1361297970.js 

Однако, [0-9]*\([0-9]\+\) не подходит.

ответ

2

Код в его нынешнем виде не работает по нескольким причинам. Сравните с:

current_timestamp=`date +%s` 
sed -ie "s/myJS-[0-9]\+\.js/myJS-${current_timestamp}.js/g" template.php 

Комментарии:

  1. date +%s должен быть внутри обратные кавычки, чтобы получить выход выполнения программы в current_timestamp переменной
  2. Закономерность [0-9]\+ достаточно, чтобы охватить все имена с рядом цифр.
  3. Я добавил фигурные скобки, чтобы разграничить имя переменной
  4. Защищенная точка в .js части, не следует путать с метасимволом ., который соответствует любому символу, кроме возврата каретки.
  5. Я добавил модификатор «g» к подстановке, чтобы произвести несколько подстановок в одной строке.
+0

извините, но вы должны что-то еще делать b/c, ваш код не работает для меня. Я просто скопировал все, что действительно смутило. Ваш код заменяет 'myJS-1361297970.js' текущей меткой времени, то есть' myJS-1361318815.js' (обратите внимание на разницу). –

+0

Прошу прощения, я не понимаю, в чем проблема. В вашем вопросе вы говорите, что хотите, чтобы старая временная метка части имени файла была заменена новой меткой времени. Это то, что делает этот код. –

+0

вы можете предоставить полный рабочий сценарий, который включает в себя гипотетическое содержимое файла, которое необходимо заменить? –

2
  • вам нужно $(..), чтобы выполнить команду. current_timestamp=$(date +%s)

  • Вам не нужно группировать, просто myJs-[0-9]\+\.js достаточно.

  • Если ваш sed поддерживает -r, он может сэкономить некоторое время.

+0

см. Комментарий к Диего внизу, все еще что-то не так ... –

2

В одну сторону: perl. Я оцениваю замещающую часть, чтобы получить результат от date +%s от оболочки. Последняя команда tr удаляет дополнительную новую строку, добавленную командой qx<...>.

perl -i.bak -lpe 's/(myJS-)\d+(\.js)/$1 . qx<date +%s> . $2/eg && tr/\n//d' infile 
+0

- @ Birei благодарит за это. Единственная проблема заключается в том, что я хочу сохранить 'date +% s' как переменную, так как мне нужна такая же временная метка в другом месте моего скрипта. Я вообще не знаю перла, не могли бы вы поделиться тем, как это будет выглядеть? –

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