我正在尝试使用新的“js / main.min.js?YYYYMMDDHHMMSS”在index.html中查找和替换字符串“js / main.js”和“js / main.min.js?YYYYMMDDHHMMSS”以下:
File='js/main.js'
MinFile='js/main.min.js'
datestr=$(date +%Y%m%d%H%M%S)
echo sed -i.bak 's,\"'"$File"'\"|\"'"$MinFile"'\?.*?\",\"'"$MinFile"'?'"$datestr"'\",g' index.html
errorMsg=$(sed -i.bak 's,\"'"$File"'\"|\"'"$MinFile"'\?.*?\",\"'"$MinFile"'?'"$datestr"'\",g' index.html)
然而它在“js / main.js”和“js / main.min.js?YYYYMMDDHHMMSS”上不匹配
答案 0 :(得分:1)
您可能想要考虑下一个perl
脚本。
use 5.014;
use warnings;
use HTML::TreeBuilder;
use POSIX qw(strftime);
my $html = HTML::TreeBuilder->new_from_file(\*DATA);
$html->no_expand_entities(1);
my $now = strftime "%Y%m%d%H%M%S", localtime;
foreach my $script ($html->find_by_tag_name('script')) {
$script->{src} = "js/main.min.js?$now" if( $script->{src} =~ m{^(js/main.js|js/main.min.js)} );
}
print $html->as_HTML(undef, "\t");
__DATA__
<html>
<head>
<script type="text/javascript" src="js/main.js"></script>
<script type="text/javascript" src="js/nomain.js"></script>
</head>
<body>
<p>The "js/main.js" script is used here</p>
</body>
</html>
将打印
<html>
<head>
<script src="js/main.min.js?20130520221648" type="text/javascript"></script>
<script src="js/nomain.js" type="text/javascript"></script>
</head>
<body>
<p>The "js/main.js" script is used here</body>
</html>
所以更改<script...
中的所有main.js,但不更改文本...
答案 1 :(得分:0)
你有:
errorMsg=$(sed -i.bak 's,.$foo.,.$bar.,g' file)
如果要在sed中使用shell变量,则应使用"
(双引号)而不是'
单引号。 shell-var不会在单引号之间展开。
尝试类似:
errorMsg=$(sed -i.bak "s,$File..$MinFile...,...$datestr...,g" index.html)
答案 2 :(得分:0)
datestr=$(date +%Y%m%d%H%M%S)
sed -ir "s/js\/(main.min.js|main.js)?(\?[0-9]*|)?/js\/main.min.js\?$datestr/g" index.html
输入:
<script src="js/main.js"></script> <script src="js/main.min.js?1234567890"></script>
输出:
<script src="js/main.min.js?20130520143027"></script> <script src="js/main.min.js?20130520143027"></script>
答案 3 :(得分:0)
问题是如何使用转义字符解析语法:
参见bash sed command failing to find and replace 导致我的解决方案的原因。
sed命令最终看起来像这样并在bash中按预期工作:
$(sed -i "s,\"$File\"\|\"$MinFile?[0-9]\{14\}\",\"$MinFile?$datestr\",g" index.html)