wake-up-neo.com

Batchdatei zum Löschen der ersten 3 Zeilen einer Textdatei

Wie der Titel besagt, brauche ich eine Batchdatei, um die ersten 3 Zeilen einer Textdatei zu löschen.

zum Beispiel:

A    
B    
C    
D    
E   
F    
G

in diesem Beispiel muss A, B und C zusammen mit der Zeile gelöscht werden

10
kriegy

Das sollte es tun

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

Dadurch wird die Datei mit den ersten 3 entfernten Zeilen neu erstellt.

Um den Benutzer auf dem neuesten Stand zu halten, können Sie Nachrichten in die Batchdatei im VBScript-Stil integrieren oder Meldungen in der Eingabeaufforderung ausgeben.

@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

Hoffe das hilft.

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

Das obige ist schnell und funktioniert mit folgenden Einschränkungen:

  • TAB-Zeichen werden in eine Reihe von Leerzeichen umgewandelt.
  • Die Anzahl der zu konservierenden Zeilen muss weniger als ~ 65535 betragen. MORE bleibt hängen (warten Sie auf einen Tastendruck), wenn die Zeilennummer überschritten wird.
  • Alle Zeilen werden durch Wagenrücklauf und Zeilenvorschub beendet, unabhängig davon, wie sie in der Quelle formatiert wurden.

Die folgende Lösung, die FOR/F mit FINDSTR verwendet, ist robuster, aber viel langsamer. Im Gegensatz zu einer einfachen FOR/F-Lösung bleiben leere Zeilen erhalten. Wie alle FOR/F-Lösungen ist sie jedoch auf eine maximale Leitungslänge von weniger als 8191 Byte beschränkt. Wieder werden alle Zeilen durch Wagenrücklauf und Zeilenvorschub beendet.

@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

Wenn Sie mein Handy-Dandy JREPL.BAT regex-Textverarbeitungsprogramm haben, können Sie Folgendes für eine sehr robuste und schnelle Lösung verwenden. Dadurch werden alle Zeilen mit Wagenrücklauf und Zeilenvorschub (\ r\n) unabhängig vom ursprünglichen Format beendet.

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

Sie können\n Zeilenabschlusszeichen anstelle von\r\n schreiben, indem Sie die Option /U hinzufügen.

Wenn Sie die ursprünglichen Leitungsabschlusszeichen beibehalten müssen, können Sie die folgende Variante verwenden. Dadurch wird die gesamte Quelldatei in eine einzige JScript-Variable geladen, sodass die Gesamtdateigröße auf etwa 1 oder 2 Gigabyte beschränkt ist (ich habe die genaue Anzahl vergessen).

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

Denken Sie daran, dass JREPL eine Batchdatei ist. Wenn Sie den Befehl in einem anderen Batch-Skript verwenden, müssen Sie CALL JREPL verwenden.

15
dbenham

Verwenden Sie sed, um nur mit der 4. Zeile zu drucken ( Edit: Nur wenn Sie Un * x verwenden :)

$ sed -e '4,$p' in.txt 
3
user647772

Ich benutze den Befehl "more" zum Ausgeben der Datei nach der n-ten Zeile . Befehl (Windows)

More +n orginalfilename.txt > outputfilename.txt

Beschreibung: Ausgabe der Textdatei nach der n-ten Zeile

1
Sarah Filano

Wenn Sie die erste Zeile überspringen und die letzte Zeile beenden möchten, können Sie meinen Code unter http://www.harchut.de/download/ms-dos/skip-tail-flatfile-example verwenden. Postleitzahl

set L_TRIMFILE_CNT=0
set L_TRIMFILE_TMPFILE=work.countrows.find.tmp
find /c /v "" %P_TRIMFILE_INFILE% > %L_TRIMFILE_TMPFILE%
for /f "skip=1 tokens=3* " %%a in (%L_TRIMFILE_TMPFILE%) do (
  if %L_TRIMFILE_CNT% == 0 set L_TRIMFILE_CNT=%%a
)
del %L_TRIMFILE_TMPFILE%
set /a L_TRIMFILE_EOF=%L_TRIMFILE_CNT%-%P_TRIMFILE_TAIL%
findstr /n .* "%P_TRIMFILE_INFILE%" > %L_TRIMFILE_TMPFILE%
if exist %P_TRIMFILE_OUTFILE% del %P_TRIMFILE_OUTFILE%
set V_TRIMFILE_SKIP="skip=%P_TRIMFILE_SKIP% tokens=1* delims=:"
if %P_TRIMFILE_SKIP% equ 0 set V_TRIMFILE_SKIP="tokens=1* delims=:"
for /f %V_TRIMFILE_SKIP% %%a in (%L_TRIMFILE_TMPFILE%) do (
  if %%a leq %L_TRIMFILE_EOF% if exist %P_TRIMFILE_OUTFILE% @echo.%%b>>%P_TRIMFILE_OUTFILE%
  if %%a leq %L_TRIMFILE_EOF% if not exist %P_TRIMFILE_OUTFILE% @echo.%%b>%P_TRIMFILE_OUTFILE%
)
del %L_TRIMFILE_TMPFILE%

Sie können eine Zeile ohne weitere Hilfsprogramme überspringen oder beenden.

0
Rob