[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Script para quitar bloques html



> 	Hola gente, tengo un ficherito html de 5.6 MB en el que
> 	ciertos patrones (bloques, como </body></html><html>...<body...>)
> 	se unas 350 veces. Borrarlos uno a uno me parece un suicidio
> 	a menos que el vi sea capaz de hacerlo y alquien me cuente
> 	cómo 0:-). Una primera idea es ¿cómo puedo en bash script
> 	volcar el contenido de un fichero entre dos líneas? P.ej.,
> 	quiero volcar el contenido del fichero hola.c entre las líneas
> 	4 y 44, luego entre la 94 y la 135, etc. ¿algún comando que
> 	permita esto a base de empipados/entubados?

Hace tiempo hice algo por el estilo, pero lo aplicaba a todo un directorio
de archivos con contenido HTML. Consta de dos scripts:

#!/bin/sh
#####unhtml.sh#####
cp -rf $1 $2
cd $1
for i in `find $1|grep \.html$`; do
    ./unhtml.pl $i ../$2/$i;
################### FIN DE ARCHIVO


#!/usr/bin/perl
#####unhtml.pl#####
use strict;
use vars qw($enTag);
my ($linea,$infile,$outfile);

&errorinvoca() if ($#ARGV != 1);

$enTag=0;
$infile = $ARGV[0];
$outfile = $ARGV[1];

open (IN,$infile) or die "No pude abrir el archivo de entrada $infile";
open (OUT,">$outfile") or die "No pude abrir el archivo de salida $outfile";
while ($linea=<IN>) {
    $linea=&procesa($linea);
    print OUT $linea;
}
close (IN);
close (OUT);

exit 0;

sub errorinvoca {
    print "ERROR DE INVOCACION\n";
    print "Sintaxis correcta:\n";
    print "unhtml <fuente> <destino>\n\n";
    exit 1;
}

sub procesa {
    my ($in,$tmp,$out);
    $in=$_[0];
    $out='';
    $tmp='';
    while ($in) {
        # $tmp es la primera letra de $in. Le quitamos la primera letra a $in.
        ($tmp,$in)=(substr($in,0,1),substr($in,1));
        if ($tmp eq '<') {
            # Si encontramos un < significa que entramos a un tag - prendemos $enTag
            $enTag = 1;
        } elsif ($tmp eq '>') {
            # Si encontramos un > significa que termina un tag, y apagamos $enTag
            $enTag = 0;
        } else {
            # Si estamos en un tag, pasamos al siguiente caracter
            next if ($enTag == 1);

            $out .= $tmp;
        }
    }
    return $out;
}
################### FIN DE ARCHIVO

Lo llamas:

./unhtml.sh dir_fuente dir_destino

No recuerdo detalles específicos, pero es corto y no está difícil de
seguir ;-)

------------------------------------------------------------
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52)5623-1118
Desarrollo y Admon. de Sistemas en Red - FES Iztacala - UNAM
Departamento de Seguridad en Computo   -   DGSCA    -   UNAM
------------------------------------------------------------
Quidquid latine dictum sit, altum viditur.



Reply to: