如何使用批处理从文本文件中删除回车符和换行符?

时间:2016-11-08 07:12:02

标签: windows batch-file command

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

输入:

ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS

输出:

ABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADS

谢谢, NIRANJAN

3 个答案:

答案 0 :(得分:3)

如果现有的行可以以空格开头,那么没有简单的纯批处理解决方案。 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千兆字节。

答案 1 :(得分:2)

setlocal enabledelayedexpansion
set "line="
for /f "delims=" %%a in (filename.txt) do set "line=!line!%%a"
echo %line%

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

答案 2 :(得分:1)

这是另一种方法:

@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

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