繁体   English   中英

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

[英]How to remove carriage return and line feed characters from a text file using batch?

我有一个固定宽度的文本文件,所以它包含前导零和空格,我需要从文件中删除回车符和换行符。 你能告诉我如何使用批处理脚本来做到这一点吗?

输入:

ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS
ABCDEF  GHIJK0000ADS

输出:

ABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADSABCDEF  GHIJK0000ADS

谢谢,尼兰詹

如果您有可能以空格开头的现有行,则没有简单的纯批处理解决方案。 可以在没有换行符的情况下编写此类行,但需要大量代码。

还有其他问题会使纯批处理解决方案进一步复杂化。

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

这就是我编写JREPL.BAT 的原因——一个正则表达式文本处理实用程序 JREPL 是纯脚本(混合批处理/JScript),可以在 XP 以后的任何 Windows 机器上本地运行。 不需要第 3 方 exe 文件。

通过jrepl /?从命令控制台访问完整文档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-07-14

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

call jrepl "^" "" /eol "" /f "input.txt" /o "output.txt"
setlocal enabledelayedexpansion
set "line="
for /f "delims=" %%a in (filename.txt) do set "line=!line!%%a"
echo %line%

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

这是一种替代方法:

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

如果您不想要最后的尾随换行符,请删除echo/命令。

优点:

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

缺点:

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

用户dbenham他的回答中提到了保持领先空白的非平凡纯批处理解决方案。 我玩弄了依赖技术,并提供了以下脚本来分享:

@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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM