Batch file 批量删除文本文件中的空白

Batch file 批量删除文本文件中的空白,batch-file,Batch File,看了几页,似乎找不到正确的答案 我在txt文件中每行有以下数据 0320024 |CYLINDER, TWISTLOCK, DOUBLE ACTING--

看了几页,似乎找不到正确的答案

我在txt文件中每行有以下数据

0320024                       |CYLINDER, TWISTLOCK, DOUBLE ACTING--                                                                                                                                                                                                            |385508-105          |KK1-39                 |21-AUG-17|NEW                           |PIECE  
如何使用批处理脚本处理txt文件,使每行的结果都像这样

0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE  
我尝试了以下方法来读取txt文件的行

for /F "tokens=*" %%A in (filename.txt) do [process] %%A

非常感谢您的帮助,谢谢

最简单的方法是使用write by

搜索正则表达式
[\t]+(?:(\\\;)\$)
表示:

[\t]+
。。。查找一个或多个空格或水平选项卡

(?:
。。。此组中的或表达式的非标记/捕获组

(\ |)\$
。。。查找一个文字解释的管道字符,如果真的找到了,则捕获该字符,或者在不匹配换行符的情况下捕获行尾字符

如果搜索表达式找到了管道字符,则替换正则表达式
$1
将引用找到的管道字符

换言之,此正则表达式查找管道字符左侧的一个或多个空格或制表符,并删除这些空格,或者在行尾查找尾随空格/制表符,并将其删除

接下来使用命令
move/Y“output.csv”“input.txt”
用生成的输出文件覆盖输入文件

当然,也可以使用最新版本的

将输出写入
output.csv

jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o "output.csv"
要直接对输入文件执行替换,请执行以下操作:

jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o -
当需要执行更多操作时,在调用
repl.bat
jrepl.bat
时必须使用命令CALL,因此这些命令行在批处理文件中使用。在这种情况下,我建议使用而不仅仅是
repl.bat
jrepl.bat

... call "%~dp0repl.bat" ...
call "%~dp0jrepl.bat" ...
现在将使用批处理文件的完整路径调用替换操作的批处理文件
repl.bat
jrepl.bat
必须存储在批处理文件的目录中。那么,运行批处理文件时的当前目录是什么并不重要

更好的方法是使用搜索正则表达式字符串
[\t]+(?=\\\|$)
,它在a中使用OR表达式,仅当下一个字符是管道字符或在行尾找到空格/制表符时,才为1个或多个空格/制表符生成正匹配。在本例中,替换字符串只是一个空字符串,因为搜索字符串只匹配空格/制表符

例如:

call "%~dp0jrepl.bat" "[ \t]+(?=\||$)" "" /f "input.txt" /o -
  • 这种类型的替换最好使用正则表达式
  • 在这里,竖条前面的所有空白区域似乎都应该 已删除(动作--后的一个空格除外)
  • 这两种方法都可以通过负向后看
    (?和正向前看
    \s+(?=\ \ \)
  • 由于批处理本身不支持RegEx(除了findstr有限的RE),因此需要另一种脚本语言或工具,如J-/vbscript、PowerShell、sed
包括PowerShell上的Windows 7,所以应该这样做

powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\|)'|sc NewName.txt"


请展示您在解决问题上的努力。您好,我试着浏览了几页并尝试了。所以每个人都说-哦,我浏览了几页,但我无法获得它,现在编写代码plzzz?请先阅读。是的,我做了,1.逐行读取txt文件,2.用空格替换双空格。然后您可以显示您的代码吗?您可以简化正则表达式并替换expr调用jrepl“\s+(?=\\\||$)”“”…
此外,如果人们在撰写答案(或评论)时总是使用jrepl.BAT而不是REPL.BAT,我将不胜感激@dbenham你是对的。JREPL.BAT使用JScript,它使用支持前瞻但不支持落后的JavaScript。因此,我本可以自己考虑更好的解决方案,使用带有前瞻和空替换字符串的搜索正则表达式字符串。我将此更好的解决方案添加到我的答案中。我喜欢
[\t]
用于匹配
\s
上的空格/制表符,因为
\s
根据Unicode规范匹配任何空格字符,这意味着它也匹配回车符和换行符。此任务中不会出现这种情况,可以使用
\s
,但使用
[\t]更安全
。谢谢。很好地在
-
之后保留了一个空格,如示例中的OP所示。但我怀疑这是OP的示例输出中的一个错误。我怀疑尾随空格是有意的。@dbenham同意,但这是演示刚刚完全理解的环视功能的机会;-)是的,环视功能非常方便。我希望JSCRIPT支持向后看,如果JREPL.BAT中有这个功能就好了。但没有这样的运气:-(JSCRIPT(和JREPL.BAT)中只支持look aheads)。你好@LotPings,谢谢你的回答。这对我帮助很大。另一个问题是,如何删除块旁边的空白?请参阅我答案的附录。
powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\|)'|sc NewName.txt"
> type NewName.txt  
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE  
powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\||$)'|sc NewName.txt"
> type NewName.txt
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE