我正在试着写一个脚本,用它来删除.txt
文件中的特定行。我已经明白了:
@echo off
for /f "skip=1delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul
它运行良好,并删除行号“1”。但是如果我删除更多的行,它不起作用,如下所示:
@echo off
for /f "skip=1,5,8) delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul
有什么问题吗?
发布于 2018-06-10 04:28:21
正如评论中所提到的,skip
并不能帮上忙。相反,如果行号(token2)不在列表中,则添加行号(使用find /v /n ""
)并输出不带行号的原始行(token1):
@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
)失败,则”
发布于 2018-06-10 09:01:09
下面是一个没有管道的变体(|
),它应该更快。此外,此处还应正确处理带有前导冒号(:
)或括号([
/]
)的行:
@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
https://stackoverflow.com/questions/50777309
复制相似问题