Grupos de Google ya no admite nuevas publicaciones ni suscripciones de Usenet. El contenido anterior sigue siendo visible.

cuestion de perl

Visto 0 veces
Saltar al primer mensaje no leído

[ Z A T O P E K ]

no leída,
20 mar 2002, 5:55:3120/3/02
a
TEngo un fichero con el formato:
From:dire...@dominio.com RELAY
From:direc...@dominio.com RELAY
From:direc...@dominio.com RELAY

Necesitaria saber como, con un script de perl ejecutando el scrip:
./scrip.pl dire...@dominio.com puedo hacer que me borre esa linea del
archivo y no las demas.

Para ello tengo hecho lo siguente pero no me funciona:
a este script se le llama scrip arg1
como veis el script es para eliminar usuairos de la tabla access del
sendmail

#!/usr/bin/perl
$n=scalar(@ARGV);
if ($n != 1) {
printf ("Uso: usrdel buzon direccionemail\n");
exit(1);
}
$email=@ARGV[0]
open (acc, '/etc/mail/access');
open (ac, '>/etc/mail/access.tmp');
while (<acc>) {
chop();
($from,$resto) = split (/:/);
if (!($buzon eq $user)) {

print ac "$dir\t$buzon\n";
}
}
close (acc);
close (ac);
open (a1, '/etc/mail/access.tmp');
open (a2, '>/etc/mail/access.tmp.tmp');
while(<a1>){
chop();
($email2,$relay) = split (/\t/);
if(!($email2 eq $email)){
print a2 "From:$email\tRELAY\n";
}
}

GRACIAS

J.A. Gutierrez

no leída,
20 mar 2002, 9:14:5020/3/02
a
[ Z A T O P E K ] <boli_N...@excite.com> wrote:
: TEngo un fichero con el formato:

: Necesitaria saber como, con un script de perl ejecutando el scrip:
: ./scrip.pl dire...@dominio.com puedo hacer que me borre esa linea del
: archivo y no las demas.

no uses perl, usa grep

egrep -v ":$direccion " /etc/mail/access > /tmp/access.$$ &&
mv /tmp/access.$$ /etc/mail/access


--
PGP and other useless info at \
http://www.cps.unizar.es/~spd/ \
finger://daphne.cps.unizar.es/spd \ Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/ \ (Virgilio)

José Luis Pérez Diez

no leída,
20 mar 2002, 7:57:2320/3/02
a

In article <a79pr5$jnm1r$1...@ID-59646.news.dfncis.de>, [ Z A T O P E K ] wrote:
> if (!($buzon eq $user)) {
^ ^ ninguna de estas dos variables esta definida es igual a
if (0) o if (!(1))
> open (a1, '/etc/mail/access.tmp');
^ el fichero esta vacio

Por que no escapas todos los caracteres susceptibles de causar problemas en una
expresion regular y usas en resultante( $expr) e una expresion regular en un
bucle
wile <> { #mientras haya entradas util para usar como filtro
my $linea = $_;
if (=~ /$expr/u) #si coincide con emilio ignarando el caso
{} #nada
else {print $linea) #Buena
}while

--
Los programadores esta ocupados intendtado mejorar los programas a prueba de
idiotas. Mientras tanto el universo intenta mejorar los idiotas. El universo
va ganando

[ Z A T O P E K ]

no leída,
20 mar 2002, 9:42:0220/3/02
a
hago esto pero no me funciona me da errores al ejecutar el script:

#!/usr/bin/perl
$n=scalar(@ARGV);
if ($n != 2) {


printf ("Uso: usrdel buzon direccionemail\n");
exit(1);
}

$user=@ARGV[0];
$email=@ARGV[1];

##esto es nuevo
open (acc, '/etc/mail/access');
while(<acc>){
my $linea=$_;
if(=~/$email/u/)#aqui da el error
{}
else{
print $linea;
}
}

he marcado la linea de error. żcomo la tendría que poner?
gracias


Fernando Arbeiza

no leída,
20 mar 2002, 13:06:4720/3/02
a
On 20 Mar 2002 14:14:50 GMT, J.A. Gutierrez

<s...@daphne.cps.unizar.es> wrote:
> no uses perl, usa grep
>
> egrep -v ":$direccion " /etc/mail/access > /tmp/access.$$
> && mv /tmp/access.$$ /etc/mail/access

¿Y usando sed?

sed '/direccion/ d' /etc/mail/access > /tmp/access.$$ &&
mv /tmp/access.$$ /etc/mail/access

--
Fernando Arbeiza
Cantabria, Spain

Jes

no leída,
20 mar 2002, 14:00:3220/3/02
a
Si no te importa que quede un hueco, una linea vacia
donde borras la que tu quieres, no es necesario usar
perl para algo tan sencillo. Desde linea de comando
puedes usar sed:

sed -e s/^direccion@dominio// fichero > fichero1

y en fichero1 tienes todo el contenido de fichero
excepto tu linea.


--
Jes
jj...@gmx.net
-------------
"He was a modest, good-humored boy. It was Oxford that made him
insufferable."

rmj

no leída,
21 mar 2002, 2:22:5721/3/02
a
> if(=~/$email/u/)#aqui da el error

prueba de escapar el '/'
if( =~ /$email\/u/)

José Luis Pérez Diez

no leída,
21 mar 2002, 6:43:1021/3/02
a
In article <a7a76t$jqtac$1...@ID-59646.news.dfncis.de>, [ Z A T O P E K ] wrote:
> $email=@ARGV[1];
>
> ##esto es nuevo
> open (acc, '/etc/mail/access');
> while(<acc>){
> my $linea=$_;
> if(=~/$email/u/)#aqui da el error
Canvia por if(=~/$email/i) o if($linea=~/$email/i)
(mea culpa -i ignora mayusculas y minusculas- man perlre para mas
informacion)

Si no escapas caracteres que tengan relevancia en expresiones reculares podria
no darte los resutados requeriodos ( en el caso de un Email no tiene mucha
importancia)v pero buscando pe...@aqui.com te encontraria tambien pep@aqui*com
*cualquier caracter pudiendo eliminar alguna linea interesante.
para realizar las pruebas yo lo usaria como un filtro puro leer desde entrada
estandar y escribir en salida estandar.
**************Codigo***********
usr/bin/perl
#Este esta probado
$n = @ARGV;

if ($n != 2) {
printf ("Uso: usrdel buzon direccionemail\n");
exit(1);
}

$user=@ARGV[0];
$email=@ARGV[1];

my $ParaDebug = 1;

sub aviso
{
my $mensage =$_[0];
if ($ParaDebug) {print "\n$mensage\n";}
}

aviso "\$user: $user \$email :$email";
$email =~ s/\./\\./; #creamos expresion regular man perlre
#omitir si queremos eliminar por expresion regular
#podriamos añadir si lo queres rodeado de blancos
aviso "\$user: $user \$email :$email";

while(<STDIN>)
{
my $linea=$_;
if($linea =~ /$email/i)#aqui da el error
{aviso "eliminado"}
else
{print "$linea";}

0 mensajes nuevos