Отображение строк из текстового файла в пакетном файле - PullRequest
0 голосов
/ 13 апреля 2009

Я пытаюсь найти сценарий, который позволил бы мне отображать "белья # и белья #, а также строки # - #" из текстового файла в пакетном файле? Я нашел этот скрипт здесь на этом сайте ..

@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

И это прекрасно работает :) Но он захватывает количество строк в верхней части текстового файла. Я хочу иметь возможность отображать определенные строки в текстовом файле, а также диапазон, если это возможно ..

EG: у меня есть текстовый файл с 30 строками, и я хочу отобразить строки 1-4; 7-11; 13; 17-20; 22; 26 и 29

Ответы [ 2 ]

2 голосов
/ 13 апреля 2009

Вот простая модификация примера командного файла выше. Скопируйте приведенный ниже код в файл и назовите его «LineDisplay.bat» - в качестве параметров он принимает FirstLineNumber и LastLineNumber. Пример: LineDisplay test.txt 12 30 (для чтения строк 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

Вот строка с хорошим руководством по созданию командных файлов http://vtatila.kapsi.fi/batch_tutorial.html

0 голосов
/ 13 апреля 2009

Кажется, работает:

@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

Весь сценарий мог бы использовать более эффективную проверку ошибок, примеры того, чего не следует делать или где проверка ошибок немного проблематична:

  • dl foo.txt 1-2-4 (печатает строки 1-2, но без сообщения об ошибке)
  • dl foo.txt -1 (сообщение об ошибке, что диапазон 1- неверен)

Другие ограничения:

  • Диапазоны должны быть отсортированы. В текущей реализации нет способа сделать что-то вроде dl foo.txt 7-8,1-2.
  • Никакая строка не может быть выбрана дважды. Что-то вроде dl foo.txt 1,2,2-8,11-15 остановится после второй строки.
  • Не поддерживается окончание строк в стиле UNIX (U + 000A)

РЕДАКТИРОВАТЬ: Исправлена ​​проблема с файлами, содержащими скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...