首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个.txt文件中删除最后6行

从多个.txt文件中删除最后6行
EN

Stack Overflow用户
提问于 2016-08-02 16:19:10
回答 2查看 349关注 0票数 0

我以前从没做过批处理文件。我有几十个.txt文件放在一个文件夹里(前)。C:\档案)。

这些文件都以需要删除的6行文本结尾。一个示例是(第一行中的注释空间):

代码语言:javascript
复制
   var...
'ascending';...
'LIT-xxx,LIT-xxx...
setfunction...
0.33...
getdate...

此外,我希望“新”文件覆盖当前文件,以便文件名和目录不会更改。

代码语言:javascript
复制
abs 10.txt
him 4.txt
lab 18.txt
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-02 20:53:33

下面的代码片段完全按照您的要求执行,从文本文件中删除最后六行代码:

代码语言:javascript
复制
@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "FILES=C:\files\*.txt" & rem // (specify file location and pattern)
set /A "LINES=-6"          & rem /* (specify number of lines to delete;
                             rem     positive number: delete from begin,
                             rem     negative number: delete from end) */

rem // Standard `for` loop to resolve file pattern:
for %%F in ("%FILES%") do (
    rem // Get the count of lines for the current file:
    for /F %%N in ('^< "%%~F" find /C /V ""') do set "COUNT=%%N"
    rem // Initialise a line index:
    set /A "INDEX=-LINES"
    rem /* Enumerate all lines of the current file, preserving empty ones
    rem    by preceding each with a line number, so no line appears empty
    rem    to the `for /F` loop; the line number is split off later on;
    rem    in addition, the current file is emptied after being read: */
    for /F "delims=" %%L in ('
        findstr /N /R "^" "%%~F" ^& ^> "%%~F" break
    ') do (
        rem // Increment index, get text of currently iterated line:
        set /A "INDEX+=1" & set "LINE=%%L"
        rem // Toggle delayed expansion to preserve exclamation marks:
        setlocal EnableDelayedExpansion
        rem // Check index value and write to current file conditionally:
        if !INDEX! GTR 0 if !INDEX! LEQ !COUNT! (
            rem // Split off line number from line text:
            >> "%%~F" echo(!LINE:*:=!
        )
        endlocal
    )
)

endlocal
exit /B

此方法不使用临时文件以避免任何名称冲突。但是,由于每个文件都有多个文件写入操作,所以总体性能比一次性将所有数据写入临时文件并将其移回原始文件时要差一些。

票数 0
EN

Stack Overflow用户

发布于 2016-08-02 19:05:13

将原始文件备份到另一个备份文件夹,然后运行以下脚本:

代码语言:javascript
复制
@echo off
setlocal enabledelayedexpansion
pushd "%temp%\Test"
for %%G in ("*.txt") do (set "break="
    (for /f "delims=|" %%H in (%%~G) do (
        if not defined break (
            echo %%H | findstr /r /b /c:"[ ]*var.*" >nul && set break=TRUE || echo %%H )
    )) >> %%~nG_mod.txt
    del %%~G & ren %%~nG_mod.txt %%G )
popd
exit /b

它假定:

  • 您的6行文本总是从[any number of spaces]var[any text]行开始,就像您在问题中发布的那样,在任何文件中只有一个这样的字符串。
  • 其他5个底部行不需要在每个文件中匹配
  • %temp%\Test中保存要筛选的文件,而该dir中没有其他不相关的文件。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38725735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档