Batch file to delete first 3 lines of a text file

more +3 "file.txt" >"file.txt.new"
move /y "file.txt.new" "file.txt" >nul

The above is fast and works great, with the following limitations:

  • TAB characters are converted into a series of spaces.
  • The number of lines to be preserved must be less than ~65535. MORE will hang, (wait for a key press), if the line number is exceeded.
  • All lines will be terminated by carriage return and linefeed, regardless how they were formatted in the source.

The following solution using FOR /F with FINDSTR is more robust, but is much slower. Unlike a simple FOR /F solution, it preserves empty lines. But like all FOR /F solutions, it is limited to a max line length of a bit less than 8191 bytes. Again, all lines will be terminated by carriage return and linefeed.

@echo off
setlocal disableDelayedExpsnsion
>"file.txt.new" (
  for /f "delims=" %%A in ('findstr /n "^" "file.txt"') do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    echo(!ln:*::=!
    endlocal
  )
)
move /y "file.txt.new" "file.txt" >nul

If you have my handy-dandy JREPL.BAT regex text processing utility, then you could use the following for a very robust and fast solution. This still will terminate all lines with carriage return and linefeed (\r\n), regardless of original format.

jrepl "^" "" /k 0 /exc 1:3 /f "test.txt" /o -

You can write \n line terminators instead of \r\n by adding the /U option.

If you must preserve the original line terminators, then you can use the following variation. This loads the entire source file into a single JScript variable, so the total file size is limited to approximately 1 or 2 gigabytes (I forgot the exact number).

jrepl "(?:.*\n){1,3}([\s\S]*)" "$1" /m /f "test.txt" /o -

Remember that JREPL is a batch file, so you must use CALL JREPL if you use the command within another batch script.


This should do it

for /f "skip=3 delims=*" %%a in (C:\file.txt) do (
echo %%a >>C:\newfile.txt    
)
xcopy C:\newfile.txt C:\file.txt /y
del C:\newfile.txt /f /q

That will re-create the file with the first 3 lines removed.

To keep the user updated you could integrate messages in the batch file in vbscript style or output messages in the command prompt.

@echo off
echo Removing...
for /f "skip=3 delims=*" %%a in (C:\file.txt) do (
echo %%a >>C:\newfile.txt
) >nul
echo Lines removed, rebuilding file...
xcopy C:\newfile.txt C:\file.txt /y >nul
echo File rebuilt, removing temporary files
del C:\newfile.txt /f /q >nul
msg * Done!
exit >nul

Hope this helps.