以下是优化的纯批处理解决方案,它与行数线性执行,而不管必须修剪多少字符。此解决方案也是对称的,因为它从每行的开头和结尾修剪空格和制表符,并完全删除任何结果为空的行。该脚本期望文件被修剪以作为参数传递。例如xtrim test.txt 或call xtrim "c:\test\test.txt"。结果会覆盖原始文件。
XTRIM.BAT
@echo off
setlocal disableDelayedExpansion
>"%~1.new" (
for /f "usebackq eol= tokens=*" %%A in ("%~1") do if "%%A" neq "" (
set "ln=%%A"
setlocal enableDelayedExpansion
for %%k in (
4096 2048 1024 512 256 128 64 32 16 8 4 2 1
) do for /f "eol= tokens=*" %%B in ("!ln:~-%%k!.") do (
setlocal disableDelayedExpansion
if "%%B" equ "." (
endlocal
set "ln=!ln:~0,-%%k!"
) else endlocal
)
echo !ln!
endlocal
)
)
move /y "%~1.new" "%~1" >nul
与任何纯批处理脚本一样,上述代码无法处理长度超过 ~8191 字节的行,如果处理大文件,它可能会变得非常缓慢。但是,此解决方案的速度与纯批处理一样快。
我有一个使用JREPL.BAT 的更简单和更快的解决方案 - 一个在文本文件上执行正则表达式查找/替换的实用程序。 JREPL.BAT 是一个混合 JScript/批处理脚本,可以在 XP 以后的任何 Windows 机器上本地运行。
以下一行具有完全相同的功能,除了它实际上没有限制(理论上每行最大约 2 GB),并且在处理任何可感知大小的文件时速度要快得多。
JXTRIM.BAT
@jrepl "^[ \t]*(.*?)[ \t]*$" "$1?$1:false" /jmatch /f %1 /o -
我相信上述两种解决方案都能满足 OP 的要求。然而,他们并没有完全按照要求去做。我修剪了制表符和空格,但 OP 只要求修剪前导和尾随空格。 OP 仅在删除整行时要求删除制表符,因为它是空的或因为它包含制表符和/或空格。
以下修改完全符合 OP 规定的规范:
XTRIM2.BAT
@echo off
setlocal disableDelayedExpansion
>"%~1.new" (
for /f "usebackq tokens=* eol= delims= " %%A in ("%~1") do if "%%A" neq "" (
set "ln=%%A"
setlocal enableDelayedExpansion
for %%k in (
4096 2048 1024 512 256 128 64 32 16 8 4 2 1
) do for /f "tokens=* delims= " %%B in ("!ln:~-%%k!.") do (
setlocal disableDelayedExpansion
if "%%B" equ "." (
endlocal
set "ln=!ln:~0,-%%k!"
) else endlocal
)
for /f "eol= " %%B in ("!ln!") do echo !ln!
endlocal
)
)
move /y "%~1.new" "%~1" >nul
JXTRIM2.BAT
@jrepl "^[ ]*(.*[^ \t](.*[^ ])?)[ ]*$" "$1?$1:false" /jmatch /f %1 /o -