You are here

Aggiungere/Rimuovere lo stesso pezzo di codice (ad es. Google Analytics) a tutti i file html nella cartella corrente e nelle sottocartelle

Ho un sito statico nel quale vorrei inserire il codice di Google Analytics in tutte le pagine. C'è solo un piccolo problemino... in tutto i file html che dovrei modificare sono centinaia: ho quindi ritenuto opportuno automatizzare l'inserimento del codice, scrivendo il seguente script Bash, utile non solo nella circostanza specifica, ma anche più in generale quando si voglia aggiungere lo stesso frammento di codice ad un insieme di file html. Una volta capita la logica di funzionamento dello script, sarà anche possibile cambiare il punto della pagina nel quale si vuole inserire il codice.

#!/bin/bash
# Add Google Analytics code to every html file in the current folder and subfolders
#
# Per la lettura del codice, vedi:
# "Regular expressions in Perl" http://www.cs.tut.fi/~jkorpela/perl/regexp.html
# "How can I match a multi-line regexp?" http://www.perlmonks.org/?node_id=17947
# "Passing variable from bash to perl in a bash script" http://www.linuxquestions.org/questions/programming-9/passing-variable-from-bash-to-perl-in-a-bash-script-524991/
#

codice="<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-X', 'example.net');
  ga('send', 'pageview');

</script>"

string_to_search='/'
string_to_replace='\/'
result_string="${codice//$string_to_search/$string_to_replace}" # it escapes slashes "/"

recursive() {
  for file in *; do
    if [ -d "$file" ]; then
      (cd "$file"; recursive)
    fi
    if [[ "$file" =~ \.html?$ ]]; then
    perl -i.bak -e 'undef $/; $_=<>; s/<\/body>\n<\/html>/\n'"${result_string}"'\n<\/body>\n<\/html>/gi; print' $file
    echo $file fatto
    fi
  done
}

recursive

Ovviamente, chiunque voglia usare questro script, dovrà solo cambiare la variabile "codice" con il proprio codice di monitoraggio del sito o con quant'altro voglia aggiungere a tutte le pagine. Ho discusso questo codice su Stack Overflow (e grazie all'aiuto ricevuto ho fatto una piccola correzione):

http://stackoverflow.com/questions/23030169/perl-regex-substitution-gives-me-an-extra-character-single-quote-in-the-output

Per rimuovere invece uno script esistente, il codice sarà uguale al precedente, fatta eccezione per i parametri usati con Perl. Riscrivendo tutto il codice in Perl, come suggerito nella discussione su Stack Overflow sopra citata, posso usare quanto segue per rimuovere da ogni pagina html il pezzo di codice di Google Analytics:

#!/usr/bin/perl

# Remove Google Analytics code to every html file in the current folder and subfolders

use File::Find;

use warnings;
use strict;

my $codice="<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXXX-X', 'example.net');
  ga('send', 'pageview');

</script>";

sub insert_codice
{
  my $filename = $File::Find::name;
  return unless $filename =~ m/.html?\Z/;
  {
    my $backup = "$filename.bak";
    local $/ = undef;
    open ( my $input_fh, "<", $filename );
    my $input_text = <$input_fh>;
    close ( $input_fh );

    open ( my $backup_fh, ">", "$filename.bak" );
    print {$backup_fh} $input_text;
    close $backup_fh;

    open ( my $output_fh, ">", $filename );
    $input_text =~ s,\Q$codice\E,,gi;
    print {$output_fh} $input_text;
    close $output_fh;
  }
}

find ( \&insert_codice, "." );

Concludo con una osservazione: quando ho rimosso, da alcune centinaia di files html, Google Analytics con lo script Perl qui riportato, ho notato che in alcune pagine lo script non era stato rimosso: non so perché. Se in futuro scoprirò errori nel codice, provvederò ad aggiornare questa pagina.

Happy hacking a tutti,
Francesco Galgani

Classificazione: