我有一个固定宽度的文本文件,所以它包含前导零和空格,我需要从文件中删除回车符和换行符。 你能不能让我知道如何使用批处理脚本来做到这一点?
input:
ABCDEF GHIJK0000ADS ABCDEF GHIJK0000ADS ABCDEF GHIJK0000ADS
输出:
ABCDEF GHIJK0000ADSABCDEF GHIJK0000ADSABCDEF GHIJK0000ADS
谢谢,Niranjan
setlocal enabledelayedexpansion set "line=" for /f "delims=" %%a in (filename.txt) do set "line=!line!%%a" echo %line%
阅读每一行;积累。 依靠delayed expansion
模式
如果您有现有的行可能以空格开头,那么没有简单的纯批次解决方案。 可以不用换行符来写这样的代码,但是代码很多。
还有其他问题可能使纯批处理解决方案进一步复杂化。
一般来说,如果你需要一个健壮的,通用的解决方案,Windows批处理是糟糕的选择来处理文本文件,
这就是为什么我写了JREPL.BAT – 一个正则表达式文本处理工具 。 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千兆字节。
这是另一种方法:
@echo off for /F usebackq^ delims^=^ eol^= %%L in ("filename.txt") do ( < nul set /P ="%%L" ) echo/
如果您不想要最后的换行符,请删除echo/
命令。
优点:
缺点:
=
开头; 用户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
除了前面的空格不再丢失这个事实之外,这种方法不会导致当一行以=
符号开始时的错误。