使用bash sed替换文件中的文件名变量

时间:2013-05-20 19:08:06

标签: bash sed

我正在尝试使用新的“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”上不匹配

4 个答案:

答案 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)

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

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

参见bash sed command failing to find and replace 导致我的解决方案的原因。

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

$(sed -i "s,\"$File\"\|\"$MinFile?[0-9]\{14\}\",\"$MinFile?$datestr\",g" index.html)