Página 1 de 1

Eliminar palabras de un fichero

NotaPublicado: 2013-05-26 17:24 @767
por diegons92
¡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

Re: Eliminar palabras de un fichero

NotaPublicado: 2013-05-26 18:38 @818
por explorer
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?

Re: Eliminar palabras de un fichero

NotaPublicado: 2013-05-27 06:54 @329
por diegons92
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.002 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.

Re: Eliminar palabras de un fichero

NotaPublicado: 2014-06-08 12:37 @567
por anmaval
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.

Re: Eliminar palabras de un fichero

NotaPublicado: 2014-06-16 23:42 @029
por explorer
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