【问题标题】:Displaying lines from text file in a batch file在批处理文件中显示文本文件中的行
【发布时间】:2009-04-13 14:36:50
【问题描述】:

我正在尝试找到一个脚本,它可以让我在批处理文件中的文本文件中显示“行号# 和行号# 以及行#-#”?我在这个网站上找到了这个脚本..

@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

【问题讨论】:

    标签: text batch-file numbers lines


    【解决方案1】:

    这是对上述示例批处理文件的简单修改。将下面的代码复制到文件并将其命名为“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

    【讨论】:

      【解决方案2】:

      似乎有效:

      @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)

      编辑:修复了包含括号的文件的问题。

      【讨论】:

        猜你喜欢
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2013-06-06
        相关资源
        最近更新 更多