• Publicidad

Eliminar palabras de un fichero

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Eliminar palabras de un fichero

Notapor diegons92 » 2013-05-26 17:24 @767

¡Buenas de nuevo! Tengo una nueva duda, que no consigo resolver, veréis:
Tengo un fichero, y en dicho fichero querría eliminar una palabra de una frase en una línea concreta.
Ejemplo:

Imaginemos que tenemos el siguiente fichero:

blablablabla
blablalba
Nombres: Pepe Paco Manolo
balblabla
blablal


Me gustaría que en el fichero, utilizando como patrón la línea de "Nombres:", eliminar la palabra "Paco", de modo que quede:

blablablabla
blablalba
Nombres: Pepe Manolo
balblabla
blablal


Un saludo
diegons92
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-26 14:56 @664

Publicidad

Re: Eliminar palabras de un fichero

Notapor explorer » 2013-05-26 18:38 @818

Bueno, eso es algo que se puede hacer desde la línea de comandos:
Código: Seleccionar todo
perl -p -i -e 's/^Nombres:.+?\KPaco\s+//' kk.txt

Explicación:
  • la opción -p hace recorrer por líneas el archivo kk.txt (el archivo que queremos modificar)
  • la opción -i indica que vamos a realizar una transformación en el propio archivo (in situ)
  • la opción -e señala el comiendo del programa Perl a ejecutar por cada línea leída
  • dentro del programa, las líneas leídas se meten en la variable por defecto $_, así que todos los operadores y funciones saben dónde está la información a procesar
  • lo que encontramos como programa es una única instrucción: una operación de sustitución (s///). Si la línea (aunque no se vea, $_) coincide con el patrón, lo encontrado es sustituido por la cadena de reemplazo
  • el patrón quiere decir: «si la línea comienza (^) por la cadena 'Nombres:', seguida por uno o más caracteres (.+), seguidos inmediatamente (?) por la cadena 'Paco', y seguida a su vez por uno o más caracteres de espacio en blanco (\s+), entonces, deshecha todo lo encontrado hasta 'Paco' (\K
  • si la línea coincide con ese patrón, sustituye lo encontrado ('Paco' y los espacios en blanco) por la cadena vacía (o sea, lo que hace es eliminarlo)
Al final tenemos el mismo archivo, pero sin el 'Paco'.

Esto lo puedes trasladar a un programa, pero claro, tendrás que escribir más líneas, para abrir archivos, leer por líneas, guardar el resultado en un espacio temporal, y escribir el resultado en el propio archivo (volver a abrir el archivo, escribir, cerrar). Depende de lo que necesites.

Más información en tu propio ordenador en perldoc perlrun, y en la Web (traducido al español).

P.D. Sí que se puede activar el modo de edición en línea, dentro de un programa Perl, ahorrando líneas de código. Ver ejemplo en perldoc perlfaq5, en la pregunta How can I use Perl's "-i" option from within a program?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar palabras de un fichero

Notapor diegons92 » 2013-05-27 06:54 @329

Gracias por responder.

No logro terminar de sacarlo.

Mirando por el foro he encontrado un cacho de código que me vale, es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         open my $VIEJO, q[<], $filename;
  2.         my $fichero = join q[], <$VIEJO>;
  3.         close $VIEJO;
  4.  
  5.         $fichero =~ s/Manolo\s//msiog;
  6.  
  7.  
  8.         open my $NUEVO, q[>], $filename;
  9.         print $NUEVO $fichero;
  10.         close $NUEVO;
  11.  
  12.         chmod(0640,"/etc/ssh/sshd_config");
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

De esta forma me funciona bien, pero "Manolo" tendría que estar dentro de una variable, y de ese modo no me funciona.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         open my $VIEJO, q[<], $filename;
  2.         my $fichero = join q[], <$VIEJO>;
  3.         close $VIEJO;
  4.  
  5.         $fichero =~ s/$nombre\s//msiog;
  6.  
  7.  
  8.         open my $NUEVO, q[>], $filename;
  9.         print $NUEVO $fichero;
  10.         close $NUEVO;
  11.  
  12.         chmod(0640,"/etc/ssh/sshd_config");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta forma no funciona, y eso que en $nombre se incluye el nombre.

Saludos

EDITO: Ya lo solucioné, había un problema y no se almacenaba bien el nombre en la variable $nombre.
diegons92
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-26 14:56 @664

Re: Eliminar palabras de un fichero

Notapor anmaval » 2014-06-08 12:37 @567

Ayuda con una frase: "mi nombre es angelica y estudio en espol"

Yo quiero eliminar la palabra 'es' de la frase y uso s/es// y me imprime:

mi nombre angelica tudio en pol

Ayuda por favor, con urgencia.
anmaval
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2014-06-05 12:37 @567

Re: Eliminar palabras de un fichero

Notapor explorer » 2014-06-16 23:42 @029

Pues... a mí sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E '$_ = "mi nombre es angelica y estudio en espol"; s/es//; say'
  2. mi nombre  angelica y estudio en espol
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 37 invitados