从多个.txt文件中删除最后6行

时间:2016-08-02 16:19:10

标签: batch-file cmd

之前我从未做过批处理文件。我有几十个.txt文件放在一个文件夹中(例如C:\ files)。

所有文件都以6行需要删除的文本结尾。样本将是(注意第一行中的空格):

   var...
'ascending';...
'LIT-xxx,LIT-xxx...
setfunction...
0.33...
getdate...

此外,我希望"新"文件覆盖当前文件,以便文件名和目录不会更改。

abs 10.txt
him 4.txt
lab 18.txt

2 个答案:

答案 0 :(得分:0)

将原始文件备份到其他备份文件夹,然后运行此脚本:

@echo off
setlocal enabledelayedexpansion
pushd "%temp%\Test"
for %%G in ("*.txt") do (set "break="
    (for /f "delims=|" %%H in (%%~G) do (
        if not defined break (
            echo %%H | findstr /r /b /c:"[ ]*var.*" >nul && set break=TRUE || echo %%H )
    )) >> %%~nG_mod.txt
    del %%~G & ren %%~nG_mod.txt %%G )
popd
exit /b

它假设:

  • 您的6行文本始终从[any number of spaces]var[any text]行开始,就像您在问题中发布的那样,任何文件中只有一个此类字符串
  • 其他5个底行不需要在每个文件中匹配
  • 您保存文件以在%temp%\Test中过滤,并且该目录中没有其他无关文件。

答案 1 :(得分:0)

以下代码段完全符合您的要求,从文本文件中删除最后六行:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "FILES=C:\files\*.txt" & rem // (specify file location and pattern)
set /A "LINES=-6"          & rem /* (specify number of lines to delete;
                             rem     positive number: delete from begin,
                             rem     negative number: delete from end) */

rem // Standard `for` loop to resolve file pattern:
for %%F in ("%FILES%") do (
    rem // Get the count of lines for the current file:
    for /F %%N in ('^< "%%~F" find /C /V ""') do set "COUNT=%%N"
    rem // Initialise a line index:
    set /A "INDEX=-LINES"
    rem /* Enumerate all lines of the current file, preserving empty ones
    rem    by preceding each with a line number, so no line appears empty
    rem    to the `for /F` loop; the line number is split off later on;
    rem    in addition, the current file is emptied after being read: */
    for /F "delims=" %%L in ('
        findstr /N /R "^" "%%~F" ^& ^> "%%~F" break
    ') do (
        rem // Increment index, get text of currently iterated line:
        set /A "INDEX+=1" & set "LINE=%%L"
        rem // Toggle delayed expansion to preserve exclamation marks:
        setlocal EnableDelayedExpansion
        rem // Check index value and write to current file conditionally:
        if !INDEX! GTR 0 if !INDEX! LEQ !COUNT! (
            rem // Split off line number from line text:
            >> "%%~F" echo(!LINE:*:=!
        )
        endlocal
    )
)

endlocal
exit /B

此方法不使用临时文件以避免任何名称冲突。但是,由于每个文件都有多个文件写入操作,因此整体性能比将所有数据一次写入临时文件并将其移回原始文件时要差一些。