我在页面底部有一堆带有旧版Google跟踪代码的文件:
<script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> try { var pageTracker = _gat._getTracker("UA-XXXXXXXXX-1"); pageTracker._trackPageview(); } catch(err) {}</script>
我需要更新它,以便它具有新版本的GA代码:
<script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-1']); _gaq.push(['_setDomainName', 'site.com']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
通常我会使用 find . -name "*html" -exec sed s/find/replace/ {} \;
来执行此操作,但据我所知,它无法处理多行。如何修改这样的东西来查找和替换多行,以及如何轻松处理我必须在命令行中逃脱的所有内容?我并不反对创建一个bash文件。
我也不反对在文本文件中放入“查找”和“替换”内容,然后将其拉入命令 - 至少应该使转义部分更容易。
谢谢!
答案 0 :(得分:2)
我会使用perl。
这样的事情应该让你开始:
#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp qw/slurp/;
my $text = slurp($ARGV[0]);
$text =~ s/foo\nbar/new_and_shiny/;
my $newfile = $ARGV[0] . ".new";
open my $out, ">$newfile" or die "$!";
print $out $text;
close $out;
用你的旧javascript替换foo \ nbar,不要忘记逃避所有这些特殊字符()[]等。
&LT;编辑&gt; Jim Garrison让我编辑了这个答案并添加以下内容:
您可以更进一步,用一个占位符字符串替换文件中的所有google analytics javascript,例如'GOOGLE_ANALYTIC_CODE',如下所示:
<script>
GOOGLE_ANALYTIC_CODE
</script>
并在这些文件上运行查找并替换脚本,将“GOOGLE_ANALYTIC_CODE”替换为最新的javascript,以创建“已部署”版本。
现在可能需要付出更多的努力,但它肯定会使你未来的自我受益。
当The Pragmatic Programmer书中提到“干燥原则”(不要重复自己)时,这种做法很好地记录在案。
我不能推荐那本书。那里有很多很好的建议。
&LT; /编辑&gt;
答案 1 :(得分:0)
假设你只有javascript的一部分,并假设你可以把你的新代码放到一个文件中,这里是一个Ruby脚本
#!/usr/bin/env ruby
newdata = File.open("new").read
olddata = File.open("file").read
puts olddata.gsub(/<script.*<\/script>/m, newdata )
要运行它,
$ ruby replace.rb > newfile