我想使用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]+)
不正确。
由于多种原因,目前的代码不起作用。将其与进行比较
current_timestamp=`date +%s`
sed -ie "s/myJS-[0-9]+.js/myJS-${current_timestamp}.js/g" template.php
评论:
date +%s
必须位于后引号内,才能将程序执行的输出转换为current_timestamp
变量- 模式
[0-9]+
足以捕获具有一系列数字的所有名称 - 我添加了大括号来分隔变量名
- 保护
.js
部分的点不与元字符.
混淆,该字符与除回车符以外的任何字符匹配 - 我在替换中添加了一个"g"修饰符,以便在同一行中生成多个替换
-
您需要
$(..)
来执行该命令。current_timestamp=$(date +%s)
-
你不需要分组,只要
myJs-[0-9]+.js
就足够了。 -
如果您的sed支持
-r
,它可以节省一些转义。
单向使用perl
。我对替换部分进行了评估,以从外壳中获得date +%s
的结果。最后一个tr
命令将删除由qx<...>
命令添加的附加换行符。
perl -i.bak -lpe 's/(myJS-)d+(.js)/$1 . qx<date +%s> . $2/eg && tr/n//d' infile