使用Windows批处理从文件中删除尾随空格?

Hei*_*ack 3 windows cmd batch-file

如何使用Windows命令提示符修剪文本文件中的所有尾随空格?

dbe*_*ham 8

Ben Hocking引用的DosTips RTRIM函数可用于创建可以修剪文本文件中每一行的脚本.但是,功能相对较慢.

DosTips用户(和主持人)aGerman开发了一种非常有效的右调整算法.他将算法实现为批处理"宏" - 将复杂的迷你脚本存储在可以从内存执行的环境变量中的有趣概念.带参数的宏本身就是一个主要的讨论话题,与这个问题无关.

我已经提取了一个德国算法并将其放在下面的批处理脚本中.该脚本期望将文本文件的名称作为唯一参数,然后向右调整文件中每行的空格.

@echo off
setlocal enableDelayedExpansion
set "spcs= "
for /l %%n in (1 1 12) do set "spcs=!spcs!!spcs!"
findstr /n "^" "%~1" >"%~1.tmp"
setlocal disableDelayedExpansion
(
  for /f "usebackq delims=" %%L in ("%~1.tmp") do (
    set "ln=%%L"
    setlocal enableDelayedExpansion
    set "ln=!ln:*:=!"
    set /a "n=4096"
    for /l %%i in (1 1 13) do (
      if defined ln for %%n in (!n!) do (
        if "!ln:~-%%n!"=="!spcs:~-%%n!" set "ln=!ln:~0,-%%n!"
        set /a "n/=2"
      )
    )
    echo(!ln!
    endlocal
  )
) >"%~1"
del "%~1.tmp" 2>nul
Run Code Online (Sandbox Code Playgroud)

假设脚本名为rtrimFile.bat,则可以从命令行调用它,如下所示:

rtrimFile "fileName.txt"
Run Code Online (Sandbox Code Playgroud)

关于性能
注意事项原始DosTips rtrim函数执行线性搜索,默认修剪最多32个空格.它必须每个空间迭代一次.

aGerman的算法使用二进制搜索,它能够在13次迭代中修剪批量允许的最大字符串大小(最多~8k空间).

不幸的是,在处理文本时,批处理非常慢.即使使用高效的rtrim功能,在我的机器上修剪1MB文件也需要大约70秒.问题是,只需在没有任何修改的情况下读取和写入文件就需要花费大量时间.这个答案使用FOR循环来读取文件,再加上FINDSTR为每行添加行号,以便保留空行.它会切换延迟扩展以防止!被破坏,并使用搜索和替换操作从每行中删除行号前缀.在它开始做rtrim之前所有这一切.

通过使用使用的备用文件读取机制,set /p性能可能几乎翻倍.但是,set/p方法限制为每行约1k字节,并从每行中删除尾随控制字符.

如果您需要定期修剪大型文件,那么即使性能提高一倍也可能不够.是时候下载(如果可能的话)可以在眨眼间处理文件的许多实用程序中的任何一个.

如果您不能使用非本机软件,则可以通过CSCRIPT批处理命令尝试VBScript或JScript.任何一个都会快得多.

更新 - 使用JREPL.BAT快速解决方案

JREPL.BAT是一个正则表达式查找/替换实用程序,可以非常有效地解决问题.它是纯脚本(混合批处理/ JScript),可以在XP以后的任何Windows机器上本机运行.不需要第三方exe文件.

使用JREPL.BAT在PATH中的某个位置,您可以使用以下简单命令从文件"test.txt"中删除尾随空格:

jrepl " +$" "" /f test.txt /o -
Run Code Online (Sandbox Code Playgroud)

如果将命令放在批处理脚本中,则必须在命令前面加上CALL:

call jrepl " +$" "" /f test.txt /o -
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 5

去让自己的副本CygWin的sed的GnuWin32

然后将其与命令一起使用:

sed "s/ *$//" inputFile >outputFile
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但我忘了提及,我想在没有任何其他软件的情况下修剪尾随空格。只需使用操作系统上的预装文件。 (2认同)