【问题标题】:How to remove carriage return and line feed characters from a text file using batch?如何使用批处理从文本文件中删除回车符和换行符?
【发布时间】:2016-11-08 07:12:01
【问题描述】:

我有一个固定宽度的文本文件,因此它包含前导零和空格,我需要从文件中删除回车符和换行符。 能否请您告诉我如何使用批处理脚本执行此操作?

输入:

ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS

输出:

ABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADS

谢谢, 尼兰詹

【问题讨论】:

    标签: windows batch-file command


    【解决方案1】:

    如果您有可能以空格开头的现有行,则没有简单的纯批处理解决方案。 It is possible to write such lines without newlines,不过需要很多代码。

    还有其他问题会使纯批处理解决方案更加复杂。

    一般来说,如果您想要一个强大的通用解决方案,Windows 批处理是处理文本文件的糟糕选择,

    这就是我写JREPL.BAT - a regular expression text processing utility的原因。 JREPL 是纯脚本(混合批处理/JScript),可以在 XP 以后的任何 Windows 机器上本地运行。不需要第三方 exe 文件。

    通过jrepl /?jrepl /?? 从命令控制台访问完整文档以获取分页输出。

    使用 JREPL 解决方案非常简单。

    call jrepl "[\r\n]" "" /m /f "input.txt" /o "output.txt"
    

    如果要覆盖原文件,那么

    call jrepl "[\r\n]" "" /m /f "input.txt" /o -
    

    只要 JScript 可以将整个文件读入内存,此解决方案就可以工作。我相信这个限制接近 1 GB。

    2020 年 7 月 14 日更新

    从 2020 年 2 月 29 日发布的 JREPL 版本 8.5 开始消除了大小限制。以前的版本需要/M 选项将整个文件加载到内存中。 8.5 版引入了/EOL 选项,该选项指定写入每一行时要使用的行尾序列。该值可以设置为空字符串,从而删除所有回车符和换行符,它通过一次处理一行来实现。

    call jrepl "^" "" /eol "" /f "input.txt" /o "output.txt"
    

    【讨论】:

      【解决方案2】:
      setlocal enabledelayedexpansion
      set "line="
      for /f "delims=" %%a in (filename.txt) do set "line=!line!%%a"
      echo %line%
      

      阅读每一行;积累。依赖delayed expansion模式

      【讨论】:

      • 我不确定是否可以在文件末尾添加 \r\n。此外,您假设总文件长度小于 8191 字节。问题中的示例是正确的,但我怀疑这是实际数据。
      【解决方案3】:

      这是另一种方法:

      @echo off
      for /F usebackq^ delims^=^ eol^= %%L in ("filename.txt") do (
          < nul set /P ="%%L"
      )
      echo/
      

      删除echo/ 命令以防您不想要最后的尾随换行符。

      优点:

      • 单个变量中没有行的累积,因此文件长度可能超过 ~ 8190 字节;

      缺点:

      • 领先的空白会丢失;
      • 行不能以=开头;

      用户dbenhamhis answer 中提到了重要的纯批处理解决方案,该解决方案保持领先的空白。我玩弄了依赖技术,并附上了以下脚本来分享:

      @echo off
      setlocal EnableExtensions DisableDelayedExpansion
      
      rem // Define constants here:
      set "_INFILE=filename.txt"         & rem // (input file; `%~1` is argument)
      set "_TMPNAME=%TEMP%%~n0_%RANDOM%" & rem // (name of temporary files, no ext.)
      
      rem // Build full names of temporary files:
      set "$TMPFILE=%_TMPNAME%.tmp"
      set "$SUBFILE=%_TMPNAME%.sub"
      
      rem // Store SUB (EOF) character in variable:
      > nul copy nul "%$SUBFILE%" /A
      for /F "usebackq" %%F in ("%$SUBFILE%") do set "$SUBCHAR=%%F"
      
      rem // Loop through lines of input file:
      for /F usebackq^ delims^=^ eol^= %%L in ("%_INFILE%") do (
          rem // Append SUB char. to current line and write to temp. file:
          > "%$SUBFILE%" echo(%%L%$SUBCHAR%
          rem // Copy temp. file to another temp. file, omitting SUB char. plus next:
          > nul copy "%$SUBFILE%" /A "%$TMPFILE%" /B
          rem // Output content of second temporary file:
          type "%$TMPFILE%"
      )
      
      rem // Clean up temporary files:
      del "%$SUBFILE%" "%$TMPFILE%"
      
      endlocal
      exit /B
      

      除了前导空格不再丢失这一事实之外,当行以= 符号开头时,这种方法不会导致错误。

      【讨论】:

      • 它不起作用。你能告诉我应该将什么传递给参数 %%L 吗?
      • “不工作”是什么意思?它非常适合我,使用您的示例输入数据(存储在当前工作目录中的文件 filename.txt 中)...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2013-07-13
      • 2012-11-17
      • 1970-01-01
      相关资源
      最近更新 更多