-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>

<script...そのため、テキストではなくすべての main.js を変更します...

于 2013-05-20T20:18:35.293 に答える
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

あなたが持っている :

errorMsg=$(sed -i.bak 's,.$foo.,.$bar.,g' file)

sed でシェル変数を使用する場合は、単一引用符"の代わりに (二重引用符)を使用する必要があります。'shell-var は一重引用符の間で展開されません。

次のようなものを試してください:

errorMsg=$(sed -i.bak "s,$File..$MinFile...,...$datestr...,g" index.html)
于 2013-05-20T19:15:13.610 に答える
0

問題は、エスケープ文字を使用して構文を解析する方法です。

  • ? 逃げてはいけない
  • パイプをエスケープする必要があります
  • anyscroll ブラケットはエスケープする必要があります

私の解決策に至った理由については、 bash sed command failing 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 に答える