【问题标题】:Batch: delete line feed from end of text file?批处理:从文本文件末尾删除换行符?
【发布时间】:2011-09-09 09:22:30
【问题描述】:

我有一个 .txt 文件,我需要在其中删除最后一个换行符。 在 HEX 编辑器中查看文件,最后会显示“0d 0a”。

我查看了线程How to delete Linefeed using batch file,但这并没有帮助。 我试过COPY source target /b 也没有帮助。

很遗憾,我不能使用 Java 或任何第三方工具,我需要使用批处理文件。

我怎样才能摆脱最后的换行符?

【问题讨论】:

  • 为什么链接的问题不起作用?
  • @CharlesB:我真的不知道。当我运行for /f "delims= tokens=*" %%x in (inputfile.txt) do echo %%x >> outputfile.txt 时,它给了我相同的输出——最后一个换行符仍然存在。有没有其他方法可以解决这个问题?

标签: batch-file carriage-return linefeed


【解决方案1】:

尝试以下代码作为起点

@echo off
copy %1 temp.txt
echo d >debug.tmp
echo r >>debug.tmp
echo a >>debug.tmp
echo dec cx >>debug.tmp
echo dec cx >>debug.tmp
echo. >>debug.tmp
echo g =100 102 >>debug.tmp
echo w >>debug.tmp
echo q >>debug.tmp
debug temp.txt <debug.tmp

此批处理首先将文件复制到需要具有 8.3 名称的临时文件。

然后它准备一个调试脚本来删除临时文件的最后两个字节。

前两条调试指令RD只是为了显示文件和寄存器的内容(其中重要的CX值包含了文件的长度)可以去掉。

然后调试脚本进入汇编模式A 并产生两条DEC CX 指令,将CX 的值递减两倍。空行离开汇编模式。

脚本执行G两条汇编指令。

然后调试脚本将W 写回文件中读取的相同内容,减去两个字节的长度。最后退出Q调试。

此代码仅适用于小于 64kB 的文件。对于较大的文件,您需要扩展汇编代码,在减少 CX 以减少 BX 后检查进位标志。

更多信息请阅读DEBUG /?,然后尝试DEBUG?

【讨论】:

  • +1,为此使用调试是个好主意,但在这种情况下,我更喜欢 jScript/vbscript,因为它也应该适用于 win7/64bit
【解决方案2】:

使用批处理应该可以。

@echo off
setlocal DisableDelayedExpansion
set "firstLineReady="
(
    for /F "eol=$ delims=" %%a in (myFile.txt) DO (
        if defined firstLineReady (echo()
        set "firstLineReady=1"
        <nul set /p "=%%a"
    )
) > out.txt

它复制所有行并在每一行附加一个 CR/LF,但不附加到最后一行

【讨论】:

  • 你好 Jeb,谢谢 - 这工作正常,但它也删除了我在每行开头和结尾处的 "。你知道我怎么能解决这个问题吗?再次感谢你,彼得
  • 在您的情况下,您可以将 set /p 行更改为 &lt;nul set /p .="%%a"
  • 您好 Jeb,还有一个问题:我需要附加到 &gt;&gt; out.txt 的源文件末尾有 1 个换行符。当我使用你的批次时,换行符被删除 - 完美。但是我怎么能保留那个换行符(只是不添加另一个换行符)。还是我应该为此提出一个新问题?再次非常感谢你,彼得
  • 充其量你打开一个新问题并发布示例文件的内容
  • 优秀的答案。它对我稍微调整了代码很有用。我添加了我的编辑,因为它缺少一个 ) 并且 > out.txt 在循环之外。谢谢
猜你喜欢
  • 2017-06-18
  • 2012-01-27
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多