首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用批处理文件删除特定行号

使用批处理文件删除特定行号
EN

Stack Overflow用户
提问于 2018-06-10 02:25:08
回答 2查看 1.1K关注 0票数 2

我正在试着写一个脚本,用它来删除.txt文件中的特定行。我已经明白了:

代码语言:javascript
复制
@echo off
for /f "skip=1delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul

它运行良好,并删除行号“1”。但是如果我删除更多的行,它不起作用,如下所示:

代码语言:javascript
复制
@echo off
for /f "skip=1,5,8) delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul

有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-10 04:28:21

正如评论中所提到的,skip并不能帮上忙。相反,如果行号(token2)不在列表中,则添加行号(使用find /v /n "")并输出不带行号的原始行(token1):

代码语言:javascript
复制
@echo off
(for /f "tokens=1,* delims=[]" %%a in ('type test.txt^|find /v /n ""') do (
    echo/%%a|findstr /x "1 5 8" >nul || echo/%%b
))>newfile.txt

(findstr开关x对于比较整数很重要,所以用findstr "1"找不到2018 )

||的工作原理是“如果上一个命令(findstr)失败,则”

票数 1
EN

Stack Overflow用户

发布于 2018-06-10 09:01:09

下面是一个没有管道的变体(|),它应该更快。此外,此处还应正确处理带有前导冒号(:)或括号([/])的行:

代码语言:javascript
复制
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FILE=test.txt"
set "_FNEW=newfile.txt"
set "_SKIP=,1,5,8,"

> "%_FNEW%" (
    for /F "delims=" %%L in ('findstr /N "^" "%_FILE%"') do (
        set "LINE=%%L"
        for /F "delims=:" %%K in ("%%L") do (
            setlocal EnableDelayedExpansion
            if "!_SKIP!"=="!_SKIP:,%%K,=,!" (
                echo(!LINE:*:=!
            )
            endlocal
        )
    )
)

endlocal
exit /B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50777309

复制
相关文章

相似问题

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