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