如果使用批处理(.bat)脚本给出行号,如何删除文本文件的行?

时间:2012-10-04 21:45:56

标签: batch-processing batch-file

我想编写一个批处理脚本,用户可以在其中输入行号,脚本将删除该行文本文件。

例如:tmp.txt

1. aaa
2. bbb
3. ccc
4. ddd

我想在执行脚本和用户输入3时,tmp.txt为

1. aaa
2. bbb
4. ddd

我正在尝试这样的事情:

@ECHO OFF

SET /P LINENUMBER=Enter the Line No:

FOR /F "tokens=1* delims=[]" %%a IN ('FIND /n /v "" ^< tmp.txt') DO (   
    IF %%a equ %LINENUMBER% (
                  ????????????????????
    )
)

2 个答案:

答案 0 :(得分:1)

您无法直接修改文件。您必须使用所需内容创建一个新文件,然后用新文件替换原始文件。

您可以通过重定向输出和ECHOing所需内容来创建新文件。我使用ECHO(%%b以防%% b为空,因为该行为空。如果b为空,ECHO %%b将生成ECHO is off.。大多数人使用ECHO.,但在深奥的条件下可能会失败。 ECHO(永远不会失败。

使用MOVE将原始文件替换为新文件。

您可以在FIND之后使用FINDSTR过滤掉不需要的行,从而无需检查FOR / F循环中的数字。

请注意,到目前为止,您的代码将从每行中删除任何前导[]个字符。由于在FOR迭代之前应用了行过滤器,因此您可以通过将DELIMS设置为]来略微改善这种情况。

@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "tokens=1* delims=]" %%a IN (
    'FIND /n /v "" ^<tmp.txt^|FINDSTR /VLB "[%LINENUMBER%]"'
  ) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt

如果您的任何原始行已经以]开头,那么您可以使用FINDSTR而不是FIND来引入行号。这使用nn:格式而不是[nn]。此解决方案将从您的行中删除前导:

@ECHO OFF
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "tokens=1* delims=:" %%a IN (
    'FINDSTR /n "^" tmp.txt^|FINDSTR /VLB "%LINENUMBER%:"'
  ) DO ECHO(%%b
)
>nul MOVE /y tmp.txt.new tmp.txt

如果您的文本文件包含以:]开头的行,则您无法使用FOR / F来解析行号。而是使用搜索和替换。在循环内打开和关闭延迟扩展,以保护文件中可能存在的任何!

@ECHO OFF
setlocal disableDelayedExpansion
SET /P LINENUMBER=Enter the Line No:
>tmp.txt.new (
  FOR /F "delims=" %%a IN (
    'FINDSTR /n "^" tmp.txt ^| FINDSTR /VLB "%LINENUMBER%:"'
  ) DO (
    set "ln=%%a"
    setlocal enableDelayedExpansion
    echo(!ln:*:=!
    endlocal
  )
)
>nul MOVE /y tmp.txt.new tmp.txt

答案 1 :(得分:1)

试试这个:

@echo off & setlocal 
set "InFile=Z:\Text.txt" 
set "OutFile=Z:\Erg.txt" 
set /p LineToDelete=

if exist "%OutFile%" del "%OutFile%" 
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%"