[BATCH] [APORTE] Rutina TEXTMAN para manipular archivos de texto

Iniciado por Eleкtro, 2 Octubre 2012, 15:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

Las dudas más frecuentes sobre Batch suelen ser sobre la manipulación de texto, así que he creado esta rutina para que tengan esta pequeña ayuda.

A diferencia del 99% de rutinas parecidas a esta, mi código respeta los caracteres especiales al no usar la expansión. Por contra, resulta más lento el proceso.

- ¿Que funciones tiene?

  • AÑADIR TEXTO AL PRINCIPIO DE UNA LÍNEA
  • AÑADIR TEXTO AL FINAL DE UNA LÍNEA
  • ELIMINAR UNA LINEA
  • INSERTAR UNA LINEA (VACÍA O CON TEXTO)
  • REEMPLAZAR UNA LINEA
  • REEMPLAZAR PALABRAS DE UNA LINEA
  • REEMPLAZAR PALABRAS EN TODAS LAS LINEAS
  • ELIMINAR LOS PRIMEROS "X" CARACTERES EN TODAS LAS LÍNEAS
  • ELIMINAR LOS ÚLTIMOS  "X" CARACTERES EN TODAS LAS LÍNEAS
  • CORTAR LAS PRIMERAS "X" LÍNEAS
  • CORTAR LAS ÚLTIMAS  "X" LÍNEAS

Por ejemplo, para eliminar la linea 5 en un archivo de texto lo usariamos así:

Call :TEXTMAN E 5 "Archivo.txt"

Léanse la ayuda que está escrita dentro del código antes de usarlo.

Espero que a alguien le sirva de ayuda.
Saludos.




Versión 0.2, corregido un fallo en la función de L-
Versión 0.5

@Echo OFF


:: TEXT MANIPULATOR ROUTINE v0.5
:: by Elektro H@cker


REM SYNTAX:
::
:: TEXTMAN [ACTION] [LINE(S)] [FILE] [TEXT]
::
:: * [LINE(S)] parameter is Optional for some actions
:: * [TEXT] parameter is Optional for some actions


REM ACTIONS:
::
::  AB  = ADD_BEGINNING      * Add text to the beginning of a line.
::  AE  = ADD_ENDING         * Add text to the end of a line.
::  E   = ERASE              * Delete a line.
::  I   = INSERT             * Add a empty line (Or a line with text).
::  RL  = REPLACE_LINE       * Replace a entire line.
::  RS  = REPLACE_STRING     * Replace word from line.
::  RSA = REPLACE_STRING_ALL * Replace word from all lines.
::  C+  = CHARACTER_PLUS     * Delete the first "X" characters from all lines.
::  C-  = CHARACTER_LESS     * Delete the last  "X" characters from all lines.
::  L+  = LINE_PLUS          * Cut the first "X" amount of lines.
::  L-  = LINE_LESS          * Cut the last  "X" amount of lines.
::  GL  = GET_LINE           * Delete all except "X" line.
::  GR  = GET_RANGE          * Delete all except "X" range of lines.


REM EXAMPLES:
::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::
::                                                                         ::
:: Delete the line 3                                                       ::
:: Call :TEXTMAN E 3 "Test.txt"                                            ::
::                                                                         ::                                                                       
:: Add a string to the beginning of line 3                                 ::
:: Call :TEXTMAN AL 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::                                                                     
:: Add a string to the end of line 3.                                      ::
:: Call :TEXTMAN AR 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::                                                                       
:: Add a empty line at line 3.                                             ::
:: Call :TEXTMAN I 3 "Test.txt"                                            ::
::                                                                         ::                                                                       
:: Add a line with a word at line 3.                                       ::
:: Call :TEXTMAN I 3 "Test.txt" "Elektro H@cker"                           ::
::                                                                         ::   
:: Replace the line 3 with "Elektro H@cker".                               ::
:: Call :TEXTMAN RL 3 "Test.txt" "Elektro H@cker"                          ::
::                                                                         ::
:: Replace the words "Elektro" to "H@cker" in line 3.                      ::
:: Call :TEXTMAN RS 3 "Test.txt" "Elektro" "H@cker"                        ::
::                                                                         ::
:: Replace the words "Elektro" to "H@cker" in all lines.                   ::
:: Call :TEXTMAN RSA "Test.txt" "Elektro" "H@cker"                         ::
::                                                                         ::
:: Delete the first 3 characters in all lines.                             ::
:: Call :TEXTMAN C+ 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the last 3 characters in all lines.                              ::
:: Call :TEXTMAN C- 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the first 3 lines.                                               ::
:: Call :TEXTMAN L+ 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete the last 3 lines.                                                ::
:: Call :TEXTMAN L- 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete all except the line number 3.                                    ::
:: Call :TEXTMAN SL 3 "Test.txt"                                           ::
::                                                                         ::
:: Delete all except the 3 to 9 range of lines.                            ::
:: Call :TEXTMAN SR 3 9 "Test.txt"                                         ::
::                                                                         ::
:: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: :: ::


:TEXTMAN
(SET /A "A=0", "LINE=0", "TOTAL_LINES=0")  &  (CALL :%~1 %* || (ECHO Invalid parameter & Exit /B 1)) & (GOTO:EOF)
:AB
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (if "%%B" EQU "" ((Echo %~4)>> "%~3.NEW") ELSE ((Echo %~4%%B)>> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:AE
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %%B%~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:E
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B) >> "%~3.NEW"))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:I
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF     "%%LINE%%" EQU "%~2" (IF NOT "%~4" EQU "" ((Echo %~4) >> "%~3.NEW") ELSE (Echo+>> "%~3.NEW"))" & (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW"))))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RL
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE ((Echo %~4)>> "%~3.NEW")"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RS
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "IF NOT "%%LINE%%" EQU "%~2" (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)>> "%~3.NEW")) ELSE (CALL SET "STRING=%%B" &&     (if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((CALL ECHO %%STRING:%~4=%~5%%)>> "%~3.NEW")))"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:RSA
(For /F "tokens=1* delims=]" %%A in ('type "%~2" ^| find /n /v ""') DO (CALL SET "STRING=%%B" && (if "%%B" EQU "" (Echo+>> "%~2.NEW") ELSE ((CALL ECHO %%STRING:%~3=%~4%%)>>"%~2.NEW")))) && (CALL :RENAMER "%~2") & (GOTO:EOF)
:C+
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~%~2%% >>      "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:C-
(For /F "usebackq tokens=*" %%@ in ("%~3") DO (Call Set   "LINE=%%@" && (CALL ECHO %%LINE:~0,-%~2%% >>   "%~3.NEW"))) && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L+
(Call SET /A "A=%~2") && (Call TYPE "%~3" |@MORE +%%A%% > "%~3.NEW") && (CALL :RENAMER "%~3") & (GOTO:EOF)
:L-
(For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (CALL SET /A "TOTAL_LINES+=1")) & (CALL SET /A "TOTAL_LINES-=%~2-1") & (For /F "tokens=1* delims=]" %%A in ('type "%~3" ^| find /n /v ""') DO (Call Set /A "LINE+=1" & Call echo "%%LINE%%"|@FIND "%%TOTAL_LINES%%" >NUL) && (CALL :RENAMER "%~3" && GOTO:EOF) || (Echo %%B >> "%~3.NEW"))
:GL
(Call SET /A "A=%~2" && Call SET /A "A-=1") && (Call TYPE "%~3" |@MORE +%%A%% > "%temp%\getline.tmp") && (For /F "tokens=1* delims=]" %%A in ('type "%temp%\getline.tmp" ^| find /n /v ""') DO ((if "%%B" EQU "" (Echo+>> "%~3.NEW") ELSE ((Echo %%B)> "%~3.NEW"))) && ((CALL :RENAMER "%~3") & (GOTO:EOF)))
:GR
(For /F "tokens=1* delims=]" %%A in ('type "%~4" ^| find /n /v ""') DO (Call Set /A "LINE+=1" && (CMD /C "(IF "%%LINE%%" GEQ "%~2" IF "%%LINE%%" LEQ "%~3" (if "%%B" EQU "" (Echo+>> "%~4.NEW") ELSE ((Echo %%B)>> "%~4.NEW"))) && (IF "%%LINE%%" EQU "%~3" Exit /B 1)" || ((CALL :RENAMER "%~4") & (GOTO:EOF)))))

:RENAMER
(REN "%~1" "%~nx1.BAK") & (MOVE /Y "%~1.BAK" "%TEMP%\" >NUL) & (REN "%~1.NEW" "%~nx1") & (GOTO:EOF)








Rikosky

Como se podria insertar una linea de texto al principio de un .txt?

echo %text23%>>Accesos.txt

Lo mismo que se haria con ese codigo, pero insertando la linea al principio y no al final, de forma que lo mas reciente este arriba y no al final del texto.

FranciskoAsdf

Que buen aporte! (como siempre :D), yo que manipulo muchos archivos en el trabajo me sirve mucho para aprender y para -porfin- tener una forma rapida de donde sacar ejemplos y asi aplicarlos a otros Scripts !!

Muchas Gracias!!
Asdf debería ser algún tipo de función.