如何进行多线查找&从* Nix命令行替换?

时间:2011-04-01 01:15:33

标签: linux unix replace find grep

我在页面底部有一堆带有旧版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文件。

我也不反对在文本文件中放入“查找”和“替换”内容,然后将其拉入命令 - 至少应该使转义部分更容易。

谢谢!

2 个答案:

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