使用Sed将旧时间戳替换为当前时间戳

时间:2013-02-19 21:10:20

标签: linux bash sed

我想使用Sed在template.php文件中查找JS文件名称的unix时间戳部分,并将其替换为当前时间戳。旧的时间戳会有所不同,所以我需要一个正则表达式来匹配一个数字。

这是我到目前为止所拥有的:

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]\+\)不正确。

3 个答案:

答案 0 :(得分: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”修饰符,以在同一行中产生多个替换。

答案 1 :(得分:2)

  • 您需要$(..)来执行命令。 current_timestamp=$(date +%s)

  • 您不必分组,只需myJs-[0-9]\+\.js即可。

  • 如果您的sed支持-r,则可以节省一些转义。

答案 2 :(得分:2)

使用perl的一种方法。我评估替换部分从shell获取date +%s的结果。上一个tr命令删除qx<...>命令添加的其他换行符。

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