我想要一个批处理文件:删除 txt 文件中的某一行[line number by %lnum%]
。
4 回答
这听起来像是一份工作sed
。在 Windows 上,您必须安装Windows 端口,然后从批处理文件中调用 sed。
sed '<linenumber>d' filename > newfilename
要删除第 4 行:
sed '4d' filename > newfilename
如果您在 Windows 中并且想在批处理文件中执行此操作,则可以通过蛮力执行以下操作:
@echo off
setlocal ENABLEDELAYEDEXPANSION
SET lineNum=
SET filename=%1
SET targetLine=%2
SET targetFile=%filename%.tmp
DEL %targetFile%
FOR /F " tokens=1 delims=" %%i in (%filename%) do (
SET /a lineNum += 1
if NOT !lineNum! == !targetLine! ECHO %%i >> !targetFile!
)
REN %filename% %filename%.orig
REN %targetFile% %filename%
您将目标文件的名称和要删除的行号传递到批处理中。它创建一个临时文件,将原始文件中的“好”行通过管道传输到临时文件中,然后通过重命名文件来完成,这样您就可以保留原始文件并将修改后的文件保存在适当的位置。
纯cmd?:
delline.cmd 编号 文件名
@echo off
setlocal ENABLEDELAYEDEXPANSION
set line=%~1
set file=%~nx2
set dSource=%~dp2
set i=0
for /F "delims=" %%l in (%dSource%%file%) do (
set /a i+=1
if not !i! EQU %line% call :BuildFile "%%l"
)
del /f "%dSource%%file%" >nul
for %%l in (%_file%) do echo %%~l>>"%dSource%%file%"
endlocal& exit /b 0
:BuildFile
set _file=%_file% %1
exit /b 0
___Notes_____
1:不检查参数。第一个需要是一个数字,第二个需要一个文件或路径+文件。
2:与其他答案一样,也没有临时文件。
3:使用 setlocal 可以让您通过将其命名为:delline并使用它,如:call :delline number file轻松地将该代码集成到脚本中
警告:源文件中的任何空白行都将在读取过程中被跳过/丢失(通过for..loop)。一个文件有 10 行,其中 4 行是空白,将被读取为 6 行进行处理。给定的行号将从 6 条数据行中应用(因此,删除),而不是开始的 10 行。
编辑
有点太快了,没有看到 akf 的答案,看起来真的很接近我的。
不必使用任何外部命令。你可以使用 vbscript
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
num = objArgs(0)
strFile = objArgs(1)
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfLine
linenum = objFile.Line
If linenum = Int(num) Then
objFile.SkipLine
End If
strLine = objFile.ReadLine
WScript.Echo strLine
Loop
如何使用:
C:\test>cscript /nologo removeline.vbs 4 file.txt > newfile.txt