elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 09:14  


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)

+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting (Moderadores: Novlucker, Leo Gutiérrez., EleKtro H@cker)
| | |-+  Modificar archivos de texto [batch] [Perl]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Modificar archivos de texto [batch] [Perl]  (Leído 2,661 veces)
bjeli1980

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Modificar archivos de texto [batch] [Perl]
« en: 11 Mayo 2010, 14:34 »

Hola,

Me ha surgido un problema que tengo que solucionar y no he dudado en recurrir a este foro, ya que otras veces me habeis echado una mano.

Tengo 16000 archivos de texto en una carpeta en los que les tengo que modificar un solo dato en cada archivo. Los archivos son de esta forma:

LST;1;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;;
plb;puerta común batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;;

En aquellas líneas que aparece la palabra "puerta" o "frente" necesito restarle 1 al valor que está entre el sexto y septimo punto y coma, en este caso 2275.

Por lo que esa línea quedaría así y el resto del archivo estaría igual:
plb;puerta común batiente ;;0;0;1;2274.;297.;20.;0;1;2;192;0;0;0;0;0;0;;

Gracias antes de nada.


« Última modificación: 12 Mayo 2010, 12:29 por bjeli1980 » En línea
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Modificar archivos de texto
« Respuesta #1 en: 11 Mayo 2010, 20:41 »

Es fácil si tienes perl
Código
my ($a, $_, $num, $b) = $s =~ m/(([^;]*;){6})([0-9]*)(.*)$/;
$num--;


En línea
cgvwzq

Desconectado Desconectado

Mensajes: 57


Agente P.


Ver Perfil WWW
Re: Modificar archivos de texto
« Respuesta #2 en: 11 Mayo 2010, 22:18 »

Ya lo he modificado y he añadido el bucle que recorre el directorio:

Código
@echo off
setlocal enabledelayedexpansion
 
:main
set /p "dir=Directorio: "
for /f %%x in ('dir /b %dir%') do (call :fichero !dir! %% style="color: #448888;">x)
goto:eof
 
:fichero
set "file=%1\%2"
for /f "tokens=*" %%_ in (%file%) do (
  ((echo %%_ | find "puerta" > nul) || (echo %%_ | find "frente" > nul)) && (call :linea "%%_") || (echo %%_ >> tmp.txt)
)
copy tmp.txt !file! > nul
echo  !file! hecho
del tmp.txt
goto:eof
 
:linea
for /f "delims=; tokens=1-6*" %%a in (%1) do (
  set "num=%%f" & set "num=!num:~0,-1!"
  set /a num-=1
  echo %%a;%%b;%%c;%%d;%%e;!num!.;%%g; >> tmp.txt
)
goto:eof

Al final he copiado el "num=!num:~0,-1!" de Leo, en lugar de "num=!num:.=!". Aunque funciona igual...
« Última modificación: 12 Mayo 2010, 17:48 por cgvwzq » En línea

Some stuff:

  • www.a] parsed as ]www.a]
  • Bypass elhacker's img filter with ALT attribute!
  • ¿Para cuándo SQLi I y II? WZ


Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Moderador
***
Desconectado Desconectado

Mensajes: 2.968


/^$/


Ver Perfil WWW
Re: Modificar archivos de texto
« Respuesta #3 en: 11 Mayo 2010, 23:26 »

Algunas preguntas.

Cada archivo solo contiene esto:
Código:
LST;1;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;;
plb;puerta com·n batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;;

Es decir, ¿cada archivo solo contiene 1 vez la línea con "puerta"?

¿Podemos usar aplicaciones externas? (sed para Windows)
En línea

Código
(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}
 

leorocko13@hotmail.com
https://github.com/leogtzr/
Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Moderador
***
Desconectado Desconectado

Mensajes: 2.968


/^$/


Ver Perfil WWW
Re: Modificar archivos de texto
« Respuesta #4 en: 12 Mayo 2010, 00:20 »

He hecho esto:

Supongamos que nuestro archivo se llama "file.txt", y tiene un contenido igual al que pusiste:
Código
LST;1;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;;
plb;puerta com·n batiente ;;0;0;1;2275.;297.;20.;0;1;2;192;0;0;0;0;0;0;;

La salida que da mi script es:

Código:
LST;1;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ; ;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
costados\koa9\koa9gx70;ko-//-a9-gx7-0 ;M;1;1;0;2278.;325.;18.;0;0;0;0;0;0;0;0;;;;
wa;baldas fondo 2, 3, 5 y 6;;0;0;1;1162.;280.;18.;0;0;;;;;;;;;;
plb;puerta com·n batiente ;;0;0;1;2274.;297.;20.;0;1;2;192;0;0;0;0;0;0;;

El script es este:
Código
@echo off
setlocal enabledelayedexpansion
rem Saber en que linea vamos a cambiar:
for /f "tokens=1 delims=:" %%# in ('type "file.txt" ^| findstr /i /n "puerta"') do (
set "n_line=%%#"
)
rem La linea
for /f "tokens=*" %%_ in ('type "file.txt" ^| findstr /i "puerta"') do (
set "linea=%%_"
)
set /a "count=0"
for /f "tokens=*" %%_ in (file.txt) do (
set /a count+=1
rem Mostrar normalmente:
if !count! lss !n_line! (
echo %%_
)
rem Sino, procesar:
if !count! equ !n_line! (
for /f "delims=; tokens=1-6*" %%a in ('echo !linea!') do (
set "numero=%%f"
set "numero=!numero:~0, -1!"
set /a numero-=1
echo %%a;%%b;;%%c;%%d;%%e;!numero!.;%%g
)
)
)
 

Obviamente tienes que volcar la salida a un archivo de texto nuevo, luego si quieres renombras.

Edit, esto también funciona:

Código
@echo off
setlocal enabledelayedexpansion
for /f "delims=: tokens=1-2*" %%a in ('type "file.txt" ^| findstr /i /n "puerta"') do (
set "n_line=%%a"
)
for /f "tokens=*" %%_ in ('type "file.txt" ^| findstr /i "puerta"') do (
set "linea=%%_"
)
for /f "delims=; tokens=1-6*" %%a in ('echo !linea!') do (
set "numero=%%f"
set "numero=!numero:~0, -1!"
set /a numero-=1
call:edit %%a "%%b" %%c %%d %%e !numero! "%%g"
goto:eof
)
:edit
::
(
echo %n_line%
echo %1;%~2;;%3;%4;%5;%6.;%~7 %~8
echo w
echo e
) | edlin /b file.txt > nul 2>&1
goto:eof
 
 

Lo edita en el mismo lugar.
« Última modificación: 12 Mayo 2010, 01:25 por Leo Gutiérrez. » En línea

Código
(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}
 

leorocko13@hotmail.com
https://github.com/leogtzr/
bjeli1980

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Modificar archivos de texto
« Respuesta #5 en: 12 Mayo 2010, 09:41 »

Gracias a todos por responder.

- biribau, había pensado en hacerlo en perl ya que en batch me resultaba más dificil, tengo q probar la solución q me das, pero primero tendría que buscar primero si la línea contiene la palabra "puerta" o "frente"

- Leo, si que podemos utilizar aplicaciones externas. La palabra puerta o frente podría aparecer en más de una línea, por lo que habría que cambiarlo en varias líneas.

Voy a probar lo que me habeis puesto.

 ;) ;) ;) ;)

Ya lo he probado pero no me funciona para un fichero concreto. Me falla dentro de este for: for /f "tokens=*" %%_ in (file.txt) do (

Leo tengo que cambiarlo en 16000 ficheros, por lo que tengo q hacerlo de manera que no tenga que editarlos. Puede que la palabra puerta o frente no esté en ninguna línea del fichero, también puede ser que esté en diferentes lineas.

« Última modificación: 12 Mayo 2010, 11:13 por bjeli1980 » En línea
bjeli1980

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Modificar archivos de texto
« Respuesta #6 en: 12 Mayo 2010, 12:29 »

Al final lo he hecho en Perl, os pongo el código:

Muchas gracias a todos:

Código
opendir(DIRHANDLE,".")||die "ERROR: no se puede leer directorio actual\n"; 
foreach (readdir(DIRHANDLE)){
next if ($_ eq "." || $_ eq "..");  
next if (-d "$_" && ! -l "$_");  
print $_ . "\n";
open (ENTRADA,"<$_") || die "ERROR: No puedo abrir el fichero $_\n";
#Los copio dentro la carpeta
open (SALIDA,">modificados/$_") || die "ERROR: No puedo abrir el fichero $d/$_\n";
 
 
while ($s=<ENTRADA>)
 {
my ($a, $_, $num, $b) = $s =~ m/(([^;]*;){6})([0-9]*)(.*)$/;
 
if (($s =~ /puerta/ ) || ($s =~ /frente/ ))
{
print "Encontrado";
$num--;
$s = $a . $_ . $num . $b;
}
print SALIDA $s;
 }
 close (ENTRADA);
 close (SALIDA);
}
closedir DIRHANDLE;
 
« Última modificación: 12 Mayo 2010, 23:17 por Leo Gutiérrez. » En línea
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: Modificar archivos de texto [batch] [Perl]
« Respuesta #7 en: 12 Mayo 2010, 17:19 »

      $s = $a . $_ . $num . $b;
El $_ lo había puesto ahí precisamente para que se notase que había que descartarlo, seguro que te funciona?
Porque hay unos paréntesis de una subexpresión que no interesa, pero hay que ponerlos por asociatividad  :-\
En línea
Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Moderador
***
Desconectado Desconectado

Mensajes: 2.968


/^$/


Ver Perfil WWW
Re: Modificar archivos de texto [batch] [Perl]
« Respuesta #8 en: 12 Mayo 2010, 23:20 »

@bjeli1980

Como no habías especificado, lo hice para un solo archivo en concreto.
Hacerlo con 1600 archivos sería un engorro, además de que lentísimo.
Te felicito por la decisión de hacerlo en Perl.

Saludos.
En línea

Código
(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}
 

leorocko13@hotmail.com
https://github.com/leogtzr/
bjeli1980

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Modificar archivos de texto [batch] [Perl]
« Respuesta #9 en: 13 Mayo 2010, 17:15 »

Tienes razón, no está bien, voy a echarle un vistazo.
En línea
bjeli1980

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Modificar archivos de texto [batch] [Perl]
« Respuesta #10 en: 17 Mayo 2010, 09:07 »

Ahora creo que sí.

Lo he dejado así:

Código
my ($a, $kk, $num, $b) = $s =~ m/(([^;]*;){6})([0-9]*)(.*)$/;	
$num--;
$s = $a . $num . $b ."\n";
« Última modificación: 17 Mayo 2010, 22:37 por Leo Gutiérrez. » En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Acciones sobre archivos de texto. [Batch] « 1 2 ... 13 14 »
Scripting
Leo Gutiérrez. 209 54,313 Último mensaje 31 Enero 2012, 23:15
por leb
Modificar Explorer a travez de un batch
Scripting
danielpz 0 1,523 Último mensaje 30 Noviembre 2010, 09:53
por danielpz
Modificar texto con ollydbg
Ingeniería Inversa
CAR3S? 5 2,070 Último mensaje 11 Febrero 2011, 05:45
por apuromafo
[BATCH] Ayuda guardando archivos de texto a php
Scripting
geormarsch 2 610 Último mensaje 20 Septiembre 2011, 16:33
por Poderoscuro1207
leer/modificar/escribir archivos de texto
Programación C/C++
Neibar 4 205 Último mensaje 6 Abril 2012, 01:29
por Xandrete
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines