批量删除文本文件中的空格

时间:2017-08-24 06:39:40

标签: batch-file

去了几个stackoverflow页面,似乎无法得到正确的答案。

我在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

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用REPL.BAT编写的Dave Benham

type "input.txt" | repl.bat "[ \t]+(?:(\|)|$)" "$1" >"output.csv"

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

[ \t]+ ...找到1个或多个空格或水平制表符。

(?: ... ) ...此组内OR表达式的非标记/捕获组。

(\|)|$ ...找到一个文字解释的管道字符并捕获此字符,如果真的找到了OR行结尾而没有匹配换行符。

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

换句话说,这个正则表达式在管道字符中找到1个或多个空格或制表符并删除这些空格或在行尾找到尾随空格/制表符并删除它们。

使用下一个命令move /Y "output.csv" "input.txt"用生成的输出文件覆盖输入文件。

当然也可以使用JREPL.BAT编写的Dave Benham的最新版本。

将输出写入output.csv

jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o "output.csv"

直接替换输入文件:

jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o -

当您需要执行更多操作时,必须使用命令 CALL 来调用repl.batjrepl.bat,因此在批处理文件中使用这些命令行。在这种情况下,我建议使用而不仅仅是repl.batjrepl.bat

... call "%~dp0repl.bat" ...
call "%~dp0jrepl.bat" ...

现在使用批处理文件的完整路径调用替换操作的批处理文件。 repl.batjrepl.bat必须存储在批处理文件的目录中。那么运行批处理文件的当前目录是什么并不重要。

更好的是使用搜索正则表达式字符串[ \t]+(?=\||$),它使用lookahead expression中的OR表达式,仅当下一个字符是管道时才为1个或多个空格/制表符产生正匹配字符或空格/制表符位于行尾。在这种情况下,替换字符串只是一个空字符串,因为只有空格/制表符与搜索字符串匹配。

示例:

call "%~dp0jrepl.bat" "[ \t]+(?=\||$)" "" /f "input.txt" /o -

答案 1 :(得分:1)

  • 最好使用正则表达式进行此类替换。
  • 这里似乎垂直条前面的所有空白区域都应该是 已删除(例外是acting--后面的一个空格)
  • 两者都可以使用lookarounds一个负面的后瞻(?<!-)和一个积极的前瞻\s+(?=\|)
  • 由于批处理本身没有RegEx支持(除了findstr的有限RE),还需要另一种脚本语言或工具,如J- / vbscript,PowerShell,sed。

包含PowerShell上的Windows 7,所以这应该

powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\|)'|sc NewName.txt"
  • gc是Get-Content和sc的别名,您猜对了,Set-Content
> 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"

改变了积极的前瞻,也检查了 行结尾$,文字|后面有\|(从Mofi偷来的; - )

> type NewName.txt
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE