如何使用cmd从文本文件中删除第一行?

5

这是我的文本文件,我想删除第一行(包含空白):

abc!
def  #
ghi./;
jklm
nopqrs

如何从文本文件中删除第一行?

我想让我的第二行成为第一行:

def  #
ghi./;
jklm
nopqrs

我尝试了 findstr 命令,但它没有起作用。

1
不确定为什么有人会踩它,但我认为这是一个好问题,答案也很好。 - jyao
是的,但看起来他正在寻找一个Windows解决方案。这里大多数的解决方案都是针对Linux命令行界面的。我还没找到适用于Windows的好办法,有点遗憾:( - Sauer
6个回答

11

最简单的方法(假设您的文本文件名为data.txt):

more +1 "data.txt" > "data_NEW.txt"

这将限制行长约为65535个字节/字符,文件中最多有65535行。此外,TAB键会被默认扩展为SPACE(默认为8个)。


您可以使用一个for /F循环代替(这里需要使用奇怪的未引用选项字符串语法,以便禁用默认的eol字符;,以不忽略以该字符开头的行):

@echo off
(
    for /F usebackq^ skip^=1^ delims^=^ eol^= %%L in ("data.txt") do echo(%%L
) > "data_NEW.txt"

这将限制每行长度为约8190个字符/字节,并且会丢失空行。


您可以使用for /F循环和findstr一起使用以保留空行(findstr会为每一行添加行号加上:,因此for /F不会看到空行;然后在循环体中删除了冒号之前的所有内容;切换延迟扩展确保不会丢失!):

@echo off
(
    for /F "skip=1 delims=" %%L in ('findstr /N "^" "data.txt"') do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        echo(!LINE:*:=!
        endlocal
    )
) > "data_NEW.txt"

这仍然将行限制为约8190个字符/字节的长度。


或者您可以使用输入重定向符号<set /P一起使用(此时需要预先确定总行数):

@echo off
for /F %%C in ('find /C /V "" ^< "data.txt"') do set "COUNT=%%C"
setlocal EnableDelayedExpansion
(
    for /L %%I in (1,1,%COUNT%) do (
        set "LINE=" & set /P LINE=""
        if %%I gtr 1 echo(!LINE!
    )
) < "data.txt" > "data_NEW.txt"
endlocal

这将限制每行字符/字节的长度约为1022个。


要用修改后的文件替换原始文件,只需执行以下操作:

move /Y "data_NEW.txt" "data.txt" > nul

1
让我想起了以前在Windows上经常使用“more”的日子,但现在我已经很少用它了...为这个点赞 :) - Gerhard
1
谢谢你,@GerhardBarnard!你的评论也提醒我忘了提到使用“more”时会遇到的另一个限制--请看我的编辑... - aschipfl

1
我建议使用tail命令输出从第二行开始的所有行:
tail -n +2 in.txt > out.txt

来自 man 手册:

       -n, --lines=[+]NUM
          output the last NUM lines, instead of the last  10;  or  use  -n
          +NUM to output starting with line NUM

2
这似乎是一个bash命令,但原始问题似乎与DOS CMD有关。 - tangoal

1

从提示符中,

for /f "skip=1delims=" %a in (yourtextfilename) do >>anoutputfilename echo %a

其中yourtextfilenameanoutputfilename必须是不同的文件名,并且如果它们包含空格或其他分隔符,则需要用引号括起来。


这对问题中的示例数据有效,但是如果每行示例数据中有空格,则此答案无效。严格来说,此答案也不正确,此处有一个错别字。 正确的答案应该是 do @echo %a >> anooutputfilename 而不是将 echo %a 放在最后。 - jyao
@jyao:请提供此失败的示例数据。我已经尝试使用每行中的空格,它完美地工作了。如果您指的是空行或仅包含空格的行,则是的,空行将被消除(for /f的特点),并且仅包含空格的行将被替换为“ECHO is on.”(echo的特点)。以分号开头的行也将被消除(findstr的特点)。 - Magoo
@jyao,你对于重定向回显语法的断言完全是错误的。无论重定向出现在echo之前还是之后都没有关系,并且在>>之前的空格将被复制,因此每个输出行都会以额外的空格终止。实际上,这就是使用非常规的重定向-回显结构的原因。 - Magoo
我猜测我对语法的断言确实是不正确的,因为当我进行测试时,我使用了@echo(试图防止显示echo),而没有使用@,你的命令确实有效。我很抱歉。 - jyao

0

如果你喜欢在CMD中使用Vim,可以使用以下命令:gvim -c "execute \"normal! #dd\"" file.txt,其中"#"是你想删除文本文件顶部行数的数字("#"可以是"1"、"82"或其他数字)。对于这个问题,你需要gvim -c "execute \"normal! 1dd\"" file.txt


0

使用PowerShell很容易实现。如果文件不大,Get-Content函数效果很好。

Get-Content -Path .\t.txt | Select-Object -Skip 1

如果您必须从cmd.exe shell运行,则使用以下命令:
powershell -NoProfile -Command "Get-Content -Path .\t.txt | Select-Object -Skip 1"

0

执行WMIC命令并删除第一行和最后一个空行。这可以很容易地修改为在文件上工作。我只需要一个可行的替代旧的“NET VIEW”命令。

for /f "skip=1 delims=$" %f in ('"wmic /NAMESPACE:\root\directory\ldap PATH ds_computer GET ds_samaccountname "') do @for /f %g in ("%f") do @echo \%g


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