【问题标题】:How to remove first line from a text file with cmd?如何使用cmd从文本文件中删除第一行?
【发布时间】:2018-05-25 13:26:26
【问题描述】:

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

abc!
def  #
ghi./;
jklm
nopqrs

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

我希望我的第二行是第一行:

def  #
ghi./;
jklm
nopqrs

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

【问题讨论】:

  • 请注意为什么人们不赞成它,但我认为这是一个好问题,答案也很好。

标签: batch-file text command-line cmd


【解决方案1】:

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

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

这将行的长度限制为大约 65535 个字节/字符,并将文件限制为大约 65535 行。此外,TABs 扩展为 SPACEs(默认为 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

【讨论】:

  • 让我想起了我在 Windows 上经常使用 more 的日子,这些天我从来没有真正使用过它...为那个竖起大拇指 :)
  • 谢谢你,@GerhardBarnard!您的评论还提醒我,我忘了提及使用 more 出现的另一个限制——请参阅我的编辑...
【解决方案2】:

根据提示,

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

其中yourtextfilename & anoutputfilename 必须是不同的文件名,如果它们包含空格或其他分隔符,则需要“引用”。

【讨论】:

  • 这适用于问题中的示例数据,但是,如果示例数据在每一行中都有空格,则此答案不起作用。严格来说,这个答案也不起作用,这里有一个错字。正确答案应该是do @echo %a &gt;&gt; anooutputfilename,而不是把echo %a放在最后。
  • @jyao :请提供失败的示例数据。我已经尝试在每行中使用空格,并且效果很好。如果您的意思是空行或仅包含 空格的行,那么是的,空行将被消除(for /f 的特征)并且仅包含空格的行将被替换为 ECHO is on.(@ 的特征987654328@)。以; 开头的行也将被删除(findstr 的特征)
  • @jyao 但是,您关于重定向回声语法的断言是完全错误的。重定向出现在echo 之前还是之后都没有关系,&gt;&gt; 之前的空格将被复制,因此每个输出行将由一个额外的空格终止。实际上,这就是使用非常规的redirection-before-echo结构的原因。
  • 我想我对语法的断言确实不正确,因为当我进行测试时,我使用了@echo(试图阻止显示回显),而不使用@,你的命令确实有效。我的道歉。
【解决方案3】:

我建议 tail 输出从第 2 行开始的行:

tail -n +2 in.txt > out.txt

来自手册页:

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

【讨论】:

  • 这似乎是一个 bash 命令,但原始问题似乎与 DOS CMD 相关
【解决方案4】:

使用 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"

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      :执行命令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" ) 做@echo \%g

      【讨论】:

        猜你喜欢
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2023-03-30
        • 2020-02-25
        • 2015-12-21
        • 2010-09-25
        • 1970-01-01
        相关资源
        最近更新 更多