-3

我正在尝试使用以下方法在 index.html 中查找字符串“js/main.js”和“js/main.min.js?YYYYMMDDHHMMSS”并将其替换为新的“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”不匹配

4

4 回答 4

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>

所以更改所有 main.js 中的<script...但不是文本中的...

于 2013-05-20T20:18:35.293 回答
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)
于 2013-05-20T19:15:13.610 回答
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>
于 2013-05-20T19:20:59.430 回答
0

问题是如何使用转义字符解析语法:

  • 这 ?不应该逃避
  • 管道应该逃脱
  • anyscroll 括号应该被转义

有关导致我的解决方案的原因,请参阅bash sed command failed to find and replace 。

sed 命令最终看起来像这样并在 bash 中按预期工作:

$(sed -i "s,\"$File\"\|\"$MinFile?[0-9]\{14\}\",\"$MinFile?$datestr\",g" index.html)
于 2013-05-21T14:01:12.810 回答