web-dev-qa-db-fra.com

Fichier de commandes pour supprimer les 3 premières lignes d'un fichier texte

Comme le titre l'indique, j'ai besoin d'un fichier de commandes pour supprimer les 3 premières lignes d'un fichier texte.

par exemple:

A    
B    
C    
D    
E   
F    
G

dans cet exemple, j'ai besoin de supprimer A, B et C avec la ligne

10
kriegy

Cela devrait le faire

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

Cela recréera le fichier avec les 3 premières lignes supprimées.

Pour garder l'utilisateur à jour, vous pouvez intégrer des messages dans le fichier de commandes au style vbscript ou des messages de sortie dans la commande Invite.

@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

J'espère que cela t'aides.

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

Ce qui précède est rapide et fonctionne très bien, avec les limitations suivantes:

  • Les caractères de tabulation sont convertis en une série d'espaces.
  • Le nombre de lignes à conserver doit être inférieur à ~ 65535. MORE se bloque (attendez que vous appuyiez sur une touche) si le numéro de ligne est dépassé.
  • Toutes les lignes seront terminées par retour chariot et par saut de ligne, quelle que soit la manière dont elles ont été formatées dans la source.

La solution suivante utilisant FOR/F avec FINDSTR est plus robuste, mais beaucoup plus lente. Contrairement à une solution FOR/F simple, elle préserve les lignes vides. Mais comme toutes les solutions FOR/F, elle est limitée à une longueur de ligne maximale d’un bit inférieure à 8 191 octets. De nouveau, toutes les lignes seront terminées par retour chariot et saut de ligne.

@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

Si vous avez mon handy-dandy Utilitaire de traitement de texte regex JREPL.BAT , vous pouvez utiliser ce qui suit pour une solution très robuste et rapide. Cela mettra toujours fin à toutes les lignes avec retour chariot et saut de ligne (\ r\n), quel que soit le format d'origine.

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

Vous pouvez écrire des\n terminaisons de ligne au lieu de\r\n en ajoutant l'option /U.

Si vous devez conserver les terminaisons de ligne d'origine, vous pouvez utiliser la variante suivante. Cela charge l'intégralité du fichier source dans une seule variable JScript, de sorte que la taille totale du fichier est limitée à environ 1 ou 2 gigaoctets (j'ai oublié le nombre exact).

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

N'oubliez pas que JREPL est un fichier de commandes. Vous devez donc utiliser CALL JREPL si vous utilisez la commande dans un autre script de traitement par lots.

15
dbenham

Utilisez sed pour imprimer uniquement à partir de la 4ème ligne ( Edition: Seulement si vous utilisez Un * x :)

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

J'utilise "more" pour sortir le fichier après la nième ligne Command (windows)

More +n orginalfilename.txt > outputfilename.txt

La description: Sortie du fichier txt après la nième ligne

1
Sarah Filano

Si vous voulez ignorer les premières et les dernières lignes, vous pouvez utiliser mon code à l'adresse http://www.harchut.de/download/ms-dos/skip-tail-flatfile-example.Zip

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%

Vous pouvez ignorer ou terminer la ligne d'un fichier à plat sans aucun utilitaire supplémentaire.

0
Rob