Как я могу найти и заменить многострочно из командной строки * Nix? - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть куча файлов со старым кодом отслеживания 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 ]

2 голосов
/ 01 апреля 2011

Я бы использовал 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;

Замените foo \ nbar на ваш старый javascript, и не забудьте убежатьвсе эти специальные символы () [] и т. д.

Джим Гаррисон заставил меня отредактировать этот ответ и добавить следующее:

Вы можете пойти еще дальше изамените весь javascript Google Analytics в ваших файлах одной строкой-заполнителем, скажем 'GOOGLE_ANALYTIC_CODE', которая выглядит примерно так:

<script>
GOOGLE_ANALYTIC_CODE
</script>

и запустите сценарий поиска и замены для этих файлов, чтобы заменить 'GOOGLE_ANALYTIC_CODE 'с последним javascript для создания «развернутой» версии.

Может потребоваться больше усилий сейчас, но это определенно поможет вашей будущей личности.

Эта практика очень хорошо документирована в Прагматичный программист книга, когда они обсуждают «СУХОЙ принцип» (Dont-Repeat-Yourself).

Я не могу рекомендовать эту книгу достаточно.Там много и много полезных советов.

0 голосов
/ 01 апреля 2011

Если у вас есть только одна часть 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 
...