Bueno, netsoul te ha dado unas buenas respuestas, pero creo que exceden un poco el nivel del foro Básico.
Yo te daré algunas soluciones más sencillas, y espero que fáciles de entender.
Using perl Syntax Highlighting
#!/usr/bin/perl
open my $fichero, q[<], 'code_18298.txt' or die; # Abrimos el $fichero de entrada
open my $salida, q[>], 'salida_198.txt' or die; # Abrimos el fichero de $salida
my $bloque_a_eliminar = 0;
while (my $linea = <$fichero>) { # Para cada la $línea del $fichero
if ($linea =~ m/^45646\#/) { # Si detectamos comienzo del bloque
$bloque_a_eliminar = 1; # Indicamos que estamos dentro del $bloque_a_eliminar
next; # Y saltamos a la siguiente línea
}
if ($linea =~ m/^\#/ and $bloque_a_eliminar) { # Si estamos en el $bloque_a_eliminar y llegamos a su final
$bloque_a_eliminar = 0; # Ya estamos fuera del bloque
next; # Y saltamos a la siguiente línea
}
if ($bloque_a_eliminar) { # Si estamos en el $bloque_a_eliminar
next; # Saltamos a la siguiente línea
}
print $salida $linea; # Si no es nada de lo anterior, sacamos la $línea a la $salida
}
close $fichero; # Cerramos ficheros
close $salida;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Vemos el resultado:
Using text Syntax Highlighting
explorer@portatil:~/Documents/Desarrollo> diff -y code_18298.txt salida_198.txt
1234# 1234#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #
456546# 456546#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #
45646# <
blablabalbalb <
blablablabl <
balblabl <
# <
46456# 46456#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Efectivamente, el bloque ya no está.
Otra solución muy buena es usar los
flip-flop:
Using perl Syntax Highlighting
#!/usr/bin/perl
open my $fichero, q[<], 'code_18298.txt' or die;
open my $salida, q[>], 'salida_198.txt' or die;
while (my $linea = <$fichero>) {
if ($linea =~ /^45646\#/ .. $linea =~ /^\#/) {
next;
}
print $salida $linea;
}
close $fichero;
close $salida;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
que, de forma abreviada, queda
Using perl Syntax Highlighting
#!/usr/bin/perl
open my $fichero, q[<], 'code_18298.txt' or die;
open my $salida, q[>], 'salida_198.txt' or die;
while (<$fichero>) {
next if /^45646\#/ .. /^\#/;
print $salida $_;
}
close $fichero;
close $salida;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El funcionamiento de los
flip-flop es: comprobar la primera expresión; si es cierta, el operador '..' devuelve cierto en las siguientes comprobaciones, hasta que se cumpla la siguiente condición, que hace devolver falso a partir de ese momento.
En este caso, la primera condición es la primera línea que queremos quitar, y la segunda condición, la última línea. Mientras el operador
flip-flop devuelva verdadero (estamos en el bloque a extraer), haremos un 'next' para no imprimir esa línea y saltar a procesar la siguiente línea.
Se puede incluso hasta simplificar todo el bucle while() en:
Using perl Syntax Highlighting
print $salida $_ if ! (/^45646\#/ .. /^\#/);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Es decir: imprimimos solo aquellas líneas que no (!) están dentro del bloque a extraer.
Ahora bien, todo esto lo estamos haciendo con un fichero de entrada y sacando el resultado a otro fichero de salida.
Como el fichero parece pequeño, podemos leerlo en memoria, hacer la extracción, y guardar el resultado en el mismo fichero:
Using perl Syntax Highlighting
#!/usr/bin/perl
open my $fichero, q[<], 'code_18298.txt' or die;
my @fichero = <$fichero>;
close $fichero;
open my $salida, q[>], 'code_18298.txt' or die;
for (@fichero) {
print $salida $_ if ! (/^45646\#/ .. /^\#/);
}
close $salida;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Otra forma de escribir el bucle for() sería:
Using perl Syntax Highlighting
for my $linea (grep { ! (/^45646\#/ .. /^\#/) } @fichero ) {
print $salida $linea;
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aún más abreviado sería usar las facilidades de edición de Perl, permitiendo editar el fichero desde la propia línea de comandos, como te ha mostrado netsoul, pero esta vez indicando que deseas cambiar el propio fichero de entrada.
Primero hacemos una prueba para comprobar si es correcto lo que queremos hacer:
Using bash Syntax Highlighting
explorer
@portatil:~
/Documents
/Desarrollo
> perl -n -e 'print if ! (/^45646\#/ .. /^\#/)' code_18298.txt
1234#
blablabalbalb
blablablabl
balblabl
#
456546#
blablabalbalb
blablablabl
balblabl
#
46456#
blablabalbalb
blablablabl
balblabl
#Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Con la ayuda de '-n' recorremos todo el fichero, al que aplicamos a cada línea el código Perl indicado por '-e', que dice que imprima la línea si no pertenece al bloque a extraer.
Como vemos que funciona, ya solo queda aplicar el operador '-i', que realiza la edición del propio fichero de entrada:
Using bash Syntax Highlighting
explorer
@portatil:~
/Documents
/Desarrollo
> perl -n -i -e 'print if ! (/^45646\#/ .. /^\#/)' code_18298.txt
explorer
@portatil:~
/Documents
/Desarrollo
> diff -y code_18298.txt code_18298.txt.bak
1234# 1234#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #
456546# 456546#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #
> 45646#
> blablabalbalb
> blablablabl
> balblabl
> #
46456# 46456#
blablabalbalb blablabalbalb
blablablabl blablablabl
balblabl balblabl
# #Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4