【问题标题】:Batch file to delete first 3 lines of a text file用于删除文本文件前 3 行的批处理文件
【发布时间】:2012-07-11 08:39:35
【问题描述】:

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

例如:

A    
B    
C    
D    
E   
F    
G

在本例中,我需要将 A、B 和 C 连同行一起删除

【问题讨论】:

标签: file batch-file text lines


【解决方案1】:
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 regex text processing utility,那么您可以使用以下方法来获得非常强大且快速的解决方案。无论原始格式如何,这仍然会终止所有带有回车和换行符 (\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 吗?
  • 编辑 - 添加了更强大但速度较慢的 FOR /F 解决方案,以及快速和强大的 JREPL.BAT 解决方案。
【解决方案2】:

我在第 n 行之后使用“更多”命令输出文件 命令(Windows)

More +n orginalfilename.txt > outputfilename.txt

说明: 第n行后输出txt文件

【讨论】:

    【解决方案3】:

    应该这样做

    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
    

    这将重新创建删除前 3 行的文件。

    为了让用户保持更新,您可以将消息以 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
    

    希望这会有所帮助。

    【讨论】:

    • 我似乎遇到了一个错误“>> is unexpected at this time”
    • 抱歉,有一个错字,我在for 循环中的文件名中添加了" 符号,现在试试。
    • 对不起,我发布代码时无法测试代码。我再次对其进行了编辑并进行了测试,这次它可以工作。我忘记了delims,所以当它撞到一个空间时它就坏了。立即尝试。
    • 我们花了一段时间,但我们到了,谢谢,我要提出另一个问题,它涉及 if 语句......耶
    • 别担心,是啊,终于到了! :) 好的,我会注意的!
    【解决方案4】:

    使用 sed 仅从第 4 行开始打印(编辑: 仅当您使用 Un*x 时:)

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

    【讨论】:

    • 我更喜欢将其全部保留为原生,因为我可能会分发几个副本,但谢谢
    • 这个问题被标记为batch。您必须获得 Sed for windows 才能使其工作。
    • 如果我阅读了只使用批处理的答案,我建议这样做:)
    【解决方案5】:

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

    您无需任何其他实用程序即可跳过或拖尾平面文件的行。

    【讨论】:

    • 您可能想对此答案添加一点解释。给一个人一根鱼竿总比给他一条鱼好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2012-11-11
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多