text - pantalla - echo off bat
Mostrar lĂneas del archivo de texto en un archivo por lotes (2)
Aquí hay una modificación simple del archivo de muestra por lotes anterior. Copie el código siguiente en el archivo y asígnele el nombre "LineDisplay.bat": toma FirstLineNumber y LastLineNumber como parámetros. Ejemplo: LineDisplay test.txt 12 30 (para leer las líneas 12-30)
@echo off
setlocal enabledelayedexpansion
if [%1] == [] goto usage
if [%2] == [] goto usage
if [%3] == [] goto usage
set /a FirstLineNumber = %2
set /a LastLineNumber = %3
echo Reading from Line !FirstLineNumber! to !LastLineNumber!
SET /a counter=1
for /f "usebackq delims=" %%a in (%1) do (
if !counter! GTR !LastLineNumber! goto exit
if !counter! GEQ !FirstLineNumber! echo !counter! %%a
set /a counter+=1
)
goto exit
:usage
echo Usage: LineDisplay.bat FILENAME FirstLineNumber LastLineNumber
:exit
Aquí hay una línea de un buen tutorial sobre cómo crear archivos por lotes http://vtatila.kapsi.fi/batch_tutorial.html
Estoy tratando de encontrar un script que me permita mostrar "linenumber # and linenumber #, así como las líneas # - #" de un archivo de texto en un archivo por lotes. Encontré este script aquí en este sitio ...
@echo off
setlocal enabledelayedexpansion
if [%1] == [] goto usage
if [%2] == [] goto usage
SET /a counter=0
for /f "usebackq delims=" %%a in (%2) do (
if "!counter!"=="%1" goto exit
echo %%a
set /a counter+=1
)
goto exit
:usage
echo Usage: head.bat COUNT FILENAME
:exit
Y funciona genial :) Pero toma el número de líneas de la parte superior del archivo de texto. Quiero ser capaz de mostrar ciertas líneas en el archivo de texto, así como un rango si es posible ..
EG: Tengo un archivo de texto con 30 líneas, y quiero mostrar las líneas 1-4; 7-11; 13; 17-20; 22; 26 y 29
Parece funcionar:
@ECHO OFF
REM Show usage and quit if no file name was given
IF [%1]==[] GOTO USAGE
REM Show entire file if no range was given
IF [%2]==[] TYPE %1 & GOTO :EOF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET FILENAME=%1
SET LASTLINE=0
REM Build the array of lines to display
SHIFT
:RANGEREADLOOP
CALL :BUILDARRAY %1
SHIFT
IF NOT [%1]==[] GOTO RANGEREADLOOP
REM Loop through the file and keep track of the lines to display
SET CURRENTLINE=0
SET INDEX=1
FOR /F "delims=" %%l in (%FILENAME%) DO (
SET LINE=%%l
CALL :PRINTLINE
)
GOTO :EOF
REM Adds the lines from the specified range to the array of lines to display
:BUILDARRAY
REM Find out whether we have a single line or a range
SET TEST=%1
SET /A TEST1=%TEST%
SET /A TEST2=%TEST:-=%
IF %TEST1%==%TEST2% (
REM Single line
SET /A LASTLINE+=1
SET LINES[!LASTLINE!]=%1
) ELSE (
REM Range
FOR /F "tokens=1,2 delims=-" %%x IN ("%1") DO (SET RANGESTART=%%x&SET RANGEEND=%%y)
REM Some sanity checking
IF !RANGESTART! GTR !RANGEEND! (
ECHO.Problem with range !RANGESTART!-!RANGEEND!:
ECHO. Ranges must have a start value smaller than the end value.
EXIT /B 1
) ELSE (
FOR /L %%i IN (!RANGESTART!,1,!RANGEEND!) DO (
SET /A LASTLINE+=1
SET LINES[!LASTLINE!]=%%i
)
)
)
GOTO :EOF
REM Prints the specified line if the current line should be printed
:PRINTLINE
SET /A CURRENTLINE+=1
IF %CURRENTLINE%==!LINES[%INDEX%]! (
REM We have a line to print, so do this
ECHO !LINE!
SET /A INDEX+=1
)
GOTO :EOF
REM Prints usage and exits the batch file
:USAGE
ECHO.%~n0 - Displays selected lines from a text file.
ECHO.
ECHO.Usage:
ECHO. %~n0 ^<filename^> ^<range^> ...
ECHO.
ECHO. ^<filename^> - the text file from which to read
ECHO. ^<range^> - the line range(s) to display.
ECHO.
ECHO.Example:
ECHO. %~n0 foo.txt 1-4 13 15 18-20
ECHO.
ECHO. will display the first four lines from the file "foo.txt",
ECHO. the 13th and 15th as well as the lines 18 to 20.
ECHO.
ECHO.Line ranges are separated by comma, semicolon or space. If no range is given,
ECHO.the entire file is displayed.
EXIT /B 1
GOTO :EOF
Toda la secuencia de comandos podría usar una mejor verificación de errores, ejemplos de lo que no se debe hacer o donde la comprobación de errores es poco convincente:
-
dl foo.txt 1-2-4
(imprime las líneas 1-2 pero nodl foo.txt 1-2-4
ningún mensaje de error) -
dl foo.txt -1
(mensaje de error que el rango 1- no es correcto)
Otras limitaciones:
- Los rangos deben ser ordenados. Con la implementación actual no hay forma de hacer algo como
dl foo.txt 7-8,1-2
. - No se puede seleccionar ninguna línea dos veces. Algo como
dl foo.txt 1,2,2-8,11-15
se detendrá después de la segunda línea. - Sin soporte para terminaciones de línea estilo UNIX (U + 000A)
EDITAR: Se corrigió un problema con los archivos que contienen paréntesis.