批处理文件删除文本文件的前三行

12

正如标题所述,我需要一个批处理文件来删除文本文件的前三行。

例如:

A    
B    
C    
D    
E   
F    
G

在这个例子中,我需要删除 A、B 和 C,以及该行。


请点击此链接。希望对您有所帮助。 - Arun Jain
Arun Jain 这只适用于你知道行内内容的情况下。我不知道。 - kriegy
5个回答

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

以上方法快速且效果良好,但存在以下限制:

  • TAB字符会被转换成一系列空格。
  • 要保留的行数必须小于 ~65535。如果超过了行数限制,MORE 将会挂起(等待按键)。
  • 所有行都将以回车和换行符结尾,无论源文件如何格式化。

下面使用 FOR /F 和 FINDSTR 的解决方案更加健壮,但速度较慢。与简单的 FOR /F 解决方案不同,它保留了空行。但像所有 FOR /F 解决方案一样,它的最大行长度限制略小于 8191 字节。同样,所有行都将以回车和换行符结尾。

@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

如果你有我的方便实用的JREPL.BAT正则表达式文本处理工具,那么你可以使用以下方法得到一个非常稳健和快速的解决方案。这仍然会终止所有行并换行(\r\n),无论原始格式如何。
jrepl "^" "" /k 0 /exc 1:3 /f "test.txt" /o -

你可以添加/U选项,使用换行符\n代替\r\n
如果必须保留原始的换行符,则可以使用以下变体。这将整个源文件加载到单个JScript变量中,因此总文件大小限制为大约1或2 GB(我忘记了确切的数字)。
jrepl "(?:.*\n){1,3}([\s\S]*)" "$1" /m /f "test.txt" /o -

请记住,JREPL是批处理文件,因此如果您在另一个批处理脚本中使用该命令,则必须使用CALL JREPL。


值得拥有VBScript的MsgBox GUI吗? - kriegy
编辑 - 添加了更为稳健但较慢的FOR / F解决方案,以及快速而稳健的JREPL.BAT解决方案。 - dbenham

11

这应该可以做到

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

这将重新创建文件并删除前三行。

为了让用户得到更新,您可以在批处理文件中集成VBScript样式的消息或在命令提示符中输出消息。

@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

希望这能有所帮助。


抱歉,之前在 for 循环中的文件名中放了一个 " 符号,现在可以尝试了。 - Bali C
抱歉,在我发布代码时无法进行测试。我已经再次编辑并进行了测试,现在它可以正常工作了。我忘记了 delims,所以当它遇到空格时会出错。现在请再试一次。 - Bali C
我们花了一些时间,但我们终于做到了,谢谢。我要提出另一个问题,它涉及到if语句...耶! - kriegy
@kriegy - 这个脚本仍然存在问题。它会在第一个 * 字符处截断行。它会剥离以 ; 开头的行。它会剥离空白行。虽然有消除这些问题的方法,但是使用 MORE 有一个更简单的解决方案 - dbenham
我正在编写的文件将被使用者使用,而这位使用者可能没有我的水平 (这是说得好听一点),因此我想使用消息框来进行提示,例如:运行中、完成等等。我只懂很基本的 VBScript(非常少量)。 - kriegy
显示剩余7条评论

3
使用sed命令只打印从第四行开始的内容(注意: 仅限于使用Un*x系统 :))
$ sed -e '4,$p' in.txt 

我更喜欢保持所有内容为本地语言,因为我可能会分发几份副本。谢谢你的理解。 - kriegy
这个问题被标记为[tag:batch]。你需要获取Sed for windows才能使其正常工作。 - Eitan T
如果我阅读了只使用批处理的答案,我建议这样做 :) - user647772

2

我使用"more"命令输出文件的第n行之后的内容。

命令(Windows)

More +n orginalfilename.txt > outputfilename.txt

描述:输出第n行之后的文本文件。


0

如果你想跳过第一行和最后一行,你可以使用我的代码,链接在这里: 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%

您可以在不使用任何附加工具的情况下跳过或截取平面文件的行。


1
你可能想在这个答案上添加一些解释。给一个人一支钓竿总比直接给他一条鱼更好。 - Amit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接