批量删除文本文件的第一行而不创建新文件

时间:2016-02-06 03:29:40

标签: batch-file

这个问题有什么解决方案吗?我看到很多关于删除文本文件第一行的问题,但是所有这些都需要创建一个新的文本文件。我需要这个,因为我的文本文件不断更新新行(通过第二个批处理文件),所以如果脚本创建一个新的文本文件,它可能会意外删除一些旧文本文件的新行。

我可以删除文本文件的第一行而不创建新文件吗?如果没有,为什么?

  • 仅使用 批次。
  • 不应保留空行(如果可能)。
  • 可以删除!等特殊字符。

3 个答案:

答案 0 :(得分:3)

IMO这个问题毫无意义。 无法以避免将新文件内容保存在与原始文件不同的位置;即使在任何高级编程语言中也是如此,这需要从第二行读到文件末尾并将每行复制到文件的开头。但是,在进程结束时,有必要截断文件以消除文件中的最后一个字节(使用第一行的字节数)。

批处理文件肯定无法执行此类处理,因此文件行(从第二行到文件末尾)必须存储在不同的地方。文件。其中一个答案将行存储在内存变量中,但如果文件很大,这种方法效率很低。

所以,如果问题是:"可以使用哪些技巧来不使用新文件来消除数据文件中的第一行?",那么这是一种更有效的方法:

@echo off

for /F "skip=1 delims=" %%a in ('type input.txt ^& del input.txt') do >> input.txt echo %%a

如果要保留空行,请改用此方法:

@echo off

for /F "skip=1 tokens=1* delims=:" %%a in ('findstr /N "^" input.txt ^& del input.txt') do >> input.txt echo(%%b

您应该注意,当for /F命令开始执行时,阻止该文件以进行独占访问,因此任何尝试在for /F读取文件时修改该文件通过"访问被拒绝"将被避免错误。

答案 1 :(得分:2)

如果您不关心保留空行,# Kirby .htaccess # rewrite rules <IfModule mod_rewrite.c> # enable awesome urls. i.e.: # http://yourdomain.com/about-us/team RewriteEngine on # make sure to set the RewriteBase correctly # if you are running the site in a subfolder. # Otherwise links or the entire site will break. # # If your homepage is http://yourdomain.com/mysite # Set the RewriteBase to: # # RewriteBase / # block text files in the content folder from being accessed directly RewriteRule ^content/(.*)\.(txt|md|mdown)$ index.php [L] # block all files in the site folder from being accessed directly RewriteRule ^site/(.*) index.php [L] # block all files in the kirby folder from being accessed directly RewriteRule ^kirby/(.*) index.php [L] # make panel links work RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^panel/(.*) panel/index.php [L] # make site links work RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*) index.php [L] </IfModule> # Additional recommended values # Remove comments for those you want to use. # # AddDefaultCharset UTF-8 # # php_flag short_open_tag on !(),您可以通过{运行输入文件{1}}循环,将每一行存储在一个单独的变量中,然后将变量与每一行的末尾的换行符合并。

^

然而,如果你想保留空白行和特殊字符,你可以投入一些技巧,但总体思路是一样的。

for

答案 2 :(得分:0)

通常需要一个新文件,因为请求的操作需要您进行READ和WRITE。因此,只有1个文件,您将修改您正在阅读的文件!如果您只关心生成的文件是不同的文件,可以通过删除原始文件并在完成后重命名新文件来解决。 PUSHD和POPD是可选的......如果适用,请使用。 **未经测试**

pushd "YourFolderName"
set "FileName=YourInFileName.txt"
set "TempFile=SomeTempFileName.txt"
if exist "%TempFile% del /f /q "%TempFile%"
more "%FileName%" +1 > "%TempFile%"
del /f /q "%FileName%"
ren "%TempFile%" "%FileName%"
popd