使用 .bat(CMD)从 TXT 文件中删除选定行

3
这是我的文本文件:

 Volume in drive N is ABSdrive
 Volume Serial Number is BLA - BLA

 Directory of n:\ggg\gggg\ggg\ggggg

25/10/2016  09:46           138,813 gggggg.csv
               1 File(s)        00000 bytes
               0 Dir(s)  00000000 bytes free

我需要的是只有这一行文字的.txt文件。
25/10/2016  09:46           138,813 gggggg.csv

文本文件顶部和底部不应该有空行,只需一行包含此信息的文本文件。

是否可以使用 .bat 文件来完成此操作?


嗨,Dennis,你要处理的是一个txt文件还是你自己发出dir命令?只有一个带有预定名称+扩展名的文件吗? - user6811411
可能会有更多的文件,但即使只能处理一个文件,我也会很高兴让它正常工作。 - Denis
4个回答

5
findstr /r /c:"^[0-9]" yourfile.txt > targetfile.txt

这里需要获取以数字开头的行,因为这是你问题中所需的。


4
太棒了!这是最简单、最快速的解决方案。它可以轻松地适应直接处理DIR命令输出,无需使用临时文件:dir /a-d | findstr "^[0-9]" >targefile.txt - dbenham

0
你可以使用findstr命令并将输出写入新的文本文件outfile.txt,然后在文件中搜索确切的字符串。但是,如果搜索的字符串与行完全匹配,则此方法才会将输出写入文件。
findstr /x "25/10/2016  09:46           138,813 gggggg.csv" infile.txt > outfile.txt

关于findstr命令的更多信息,我建议打开一个新的cmd窗口并输入

findstr /?

希望这能有所帮助


这是工作的一部分,每天都有不同的文件。也许有一种方法可以删除特定的1-5行和7-8行,只留下我需要的那一行吗? - Denis
将以下与编程相关的内容从英语翻译成中文。仅返回翻译后的文本或将第6行复制到另一个.txt文件中。 - Denis
Denis,你提出了一个全新的问题,我建议如果它已经满足了原始问题,就将此问题标记为已完成和已回答。关于您的评论,请查看以下链接或创建一个新问题http://stackoverflow.com/questions/12736509/how-to-delete-a-line-of-a-text-file-given-the-line-number-using-batch-bat-sc - Dunny

0
将您的文件夹拖放到此批处理文件上。
@Echo Off
Set "SrcDir=%~1"
If Not Defined SrcDir Set "SrcDir=%CD%"
(For /F EOL^=^ Delims^=^^ %%A In ('Dir/A-D "%SrcDir%"') Do Echo=%%A)>output.txt

它应该输出output.txt文件到该文件夹。(如果没有给定输入文件夹,则应将output.txt提供给当前目录)

如果您只想解析文件中的数据,则可以像这样进行适应:

@Echo Off
Set "SrcFile=%~1"
If Not Defined SrcFile Exit/B
(For /F UseBackQEOL^=^ Delims^=^^ %%A In ("%SrcFile%") Do Echo=%%A)>output.txt

只需将文件拖放到其中,或者将其调整为在第二行用您的文件路径/名称替换%〜1。


2
尝试过了,但不起作用。顺便说一下,我不需要将其制作成拖放形式,这应该是 .bat 文件的一部分。 - Denis
它可以很容易地适应输入参数为文件内容,但是你的输出文件是dir命令的结果。那个dir命令应该被我发布的内容所替换。 (而且它确实有效,我比任何其他函数都更经常使用它)。 - Compo

0
使用for /F循环来解析文本:
@echo off
for /F "usebackq skip=5 delims=" %%E in ("\path\to\your\text\file.txt") do (
    set "LINE=%%E"
    goto :EXIT_FOR
)
:EXIT_FOR
echo %LINE%

skip=5选项告诉for /F忽略前五行。 goto命令在读取第一行非跳过行后离开循环。 因此,变量LINE最终将保存感兴趣的行。

您也可以检查变量是否已定义,以选择特定的文本行,而不使用goto,如下所示:

@echo off
set "LINE="
for /F "usebackq skip=5 delims=" %%E in ("\path\to\your\text\file.txt") do (
    if not defined LINE set "LINE=%%E"
)
echo %LINE%

文本文件内容看起来像是 dir 命令的输出(类似于 dir "n:\ggg\gggg\ggg\ggggg\gggggg.csv")。您可以直接通过 for /F 解析这样的命令输出,而无需先将其存储到文本文件中 -- 参见此示例:

@echo off
for /F "skip=5 delims=" %%E in ('dir "n:\ggg\gggg\ggg\ggggg\gggggg.csv"') do (
    set "LINE=%%E"
    goto :EXIT_FOR
)
:EXIT_FOR
echo %LINE%

或者:

@echo off
set "LINE="
for /F "skip=5 delims=" %%E in ('dir "n:\ggg\gggg\ggg\ggggg\gggggg.csv"') do (
    if not defined LINE set "LINE=%%E"
)
echo %LINE%

echo %LINE% > output.txt 并且您的代码非常适合。 - Denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接