中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何删除文件中所有的行首/行尾空格和空行?
作者:
标题: [已结]如何删除文件中所有的行首/行尾空格和空行? 上一主题 | 下一主题
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『楼 主』:  [已结]如何删除文件中所有的行首/行尾空格和空行? 使用 LLM 解释/回答一下

结有a.txt,内容如下:

{******************************************************************************}

unit CnCompToCodeFrm;

{ |<PRE>
================================================================================

================================================================================
|</PRE>}

1111
2222
333

4444

要通过批处理生成b.txt,内容如下:

{******************************************************************************}
unit CnCompToCodeFrm;
{ |<PRE>
================================================================================
================================================================================
|</PRE>}
1111
2222
333
4444

删除行首/行尾空格其实就是类似很多开发语言中的Trim函数.
我搜索了论坛上的很多代码,但处理实现的程度有限,望高人支招。

已参考以下帖子,都未达:

处理一个文本文件:删除每行开头的和结尾的空格
http://www.cn-dos.net/forum/viewthread.php?tid=45557

如何删除带有空格的行,但不要删除空格
http://www.cn-dos.net/forum/viewthread.php?tid=39651
findstr /v /r /c:"^ *$" a.txt 不行,但(for /f "tokens=*" %i in ('more /s a.txt') do @echo %i) >b.txt貌似可以实现部分

新的删除空格问题??
http://www.cn-dos.net/forum/viewthread.php?tid=40858

如何去除文本中所有空格和空行(已解)
http://www.cn-dos.net/forum/viewthread.php?tid=38943

[探讨][征集][去变量左右、首尾空格的方法]
http://www.cn-dos.net/forum/viewthread.php?tid=25172
对变量有用,但对文本会无效,对类似"{ |<PRE>"等

如何删除TXT文件每行结尾的所有空格?
http://www.cn-dos.net/forum/viewthread.php?tid=36722

批处理删掉记事本中的所有空格
http://www.cn-dos.net/forum/viewthread.php?tid=34632&fpage=1&highlight=%E7%A9%BA%E6%A0%BC###
lxmxn 版主的方法连行中的空格也删除了.

如何清除文本里面开头的空格
http://www.cn-dos.net/forum/viewthread.php?tid=34631&fpage=1&highlight=%E7%A9%BA%E6%A0%BC###

如何删除批处理文件每行开头的所有空格?
http://www.cn-dos.net/forum/viewthread.php?tid=34387&fpage=1&highlight=%E7%A9%BA%E6%A0%BC###
JasonMing的方法可行,但会在末尾增加了些空行

查看了lxmxn有很多关于删除空格的回帖,行首的,行尾的,中间的,全部的,综合其它网友的回帖,但是有的要么是结果不正确,有的是无法处理某些字符行,要么是在处理变量时是正确的,但用来处理文本文件就可能是无法正确调用或结果不正确.
很多帖子的方法都是这行""导致错误:"命令语法不正确。"或者是直接被忽略

正确方法见7楼.
@echo off
cd.>b.txt
for /f "tokens=*" %%a in (a.txt) do set a=%%a &call :sub
::start b.txt
goto :eof

:sub
Setlocal EnableDelayedExpansion
:lp
set a=!a:~0,-1!
set "b=!a:~-1!
if "!b!"==" " goto :lp
if "!b!"==" " goto :lp
echo !a!>>b.txt
endlocal&goto :eof


Last edited by dejoy on 2009-2-8 at 21:18 ]


2009-2-8 02:38
查看资料  发短消息  网志   编辑帖子  回复  引用回复
jmzhwf
新手上路





积分 16
发帖 11
注册 2009-2-4
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

for /f "eol=; tokens=* delims= " %%a in (1.txt) do echo %%a>>2.txt

Last edited by jmzhwf on 2009-2-8 at 12:10 ]


2009-2-8 11:50
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

楼上的行首空格,空行都去掉了。
要去掉行尾的空格,应该把%%a 改为:%%~na

for /f "tokens=*" %%a in (1.txt) do echo %%~na>>2.txt
这样连行首的也可以去掉,只是行尾的不行

Last edited by netbenton on 2009-2-8 at 12:38 ]




精简
=> 个人网志
2009-2-8 12:33
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
jmzhwf
新手上路





积分 16
发帖 11
注册 2009-2-4
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

LS的方法我也考虑过~~但你看看2.txt的第六行就知道问题了


2009-2-8 13:21
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

@echo off
(
for /f "tokens=*" %%a in (a.txt) do call :out %%a
exit /b

:out
echo %*
goto :eof
)>b.txt


2009-2-8 13:40
查看资料  发短消息  网志   编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

Originally posted by jmzhwf at 2009-2-8 11:50 AM:
for /f "eol=; tokens=* delims= " %%a in (1.txt) do echo %%a>>2.txt

Last edited by jmzhwf on 2009-2-8 at 12:10 ]


结果同3楼说的一样,只去了行首空格,行尾的还在

Originally posted by netbenton at 2009-2-8 12:33 PM:
楼上的行首空格,空行都去掉了。
要去掉行尾的空格,应该把%%a 改为:%%~na

for /f "tokens=*" %%a in (1.txt) do echo %%~na>>2.txt
这样连行首的 ...

结果也不正确,结果如下:

{******************************************************************************}
unit CnCompToCodeFrm;
{ |<PRE>
================================================================================
================================================================================
PRE>}
1111
2222
333
4444

第6行殘了,|</PRE>}变</PRE>}了

Originally posted by tireless at 2009-2-8 01:40 PM:
@echo off
(
for /f "tokens=*" %%a in (a.txt) do call :out %%a
exit /b

:out
echo %*
goto :eof
)>b.txt


结果也不正确,如下,"{ |<PRE>"被挂了

{******************************************************************************}
unit CnCompToCodeFrm;
================================================================================
================================================================================
1111
2222
333
4444


Last edited by dejoy on 2009-2-8 at 14:04 ]


2009-2-8 13:55
查看资料  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 7 楼』:  只好用截字符串 使用 LLM 解释/回答一下

去掉串首尾空格、[TAB],还有空行。
可处理所有文本特殊字符(二进制的是不可能的)
注意,第二个if 判断是的[tab],不是空格。还有%%a &call中间是有空格的。

@echo off
cd.>a_out.txt
for /f "tokens=*" %%a in (a.txt) do set a=%%a &call :sub
start a_out.txt
goto :eof

:sub
Setlocal EnableDelayedExpansion
:lp
set a=!a:~0,-1!
set "b=!a:~-1!
if "!b!"==" " goto :lp
if "!b!"==" " goto :lp
echo !a!>>a_out.txt
endlocal&goto :eof


   此帖被 +2 点积分    点击查看详情   
评分人:【 HAT 分数: +2  时间:2009-2-8 17:47




精简
=> 个人网志
2009-2-8 14:19
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 8 楼』:   使用 LLM 解释/回答一下

Originally posted by netbenton at 2009-2-8 02:19 PM:
去掉串首尾空格、,还有空行。
可处理所有文本特殊字符(二进制的是不可能的)
注意,第二个if 判断是的,不是空格。还有%%a &call中间是 ...


结果看上去正确了,如下,谢

{******************************************************************************}
unit CnCompToCodeFrm;
{ |<PRE>
================================================================================
================================================================================
|</PRE>}
1111
2222
333
4444


删除行首和行尾的空格问题解决了,还有删除空行的没


2009-2-8 14:23
查看资料  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

你测试的结果应该没有空行了吧
不信,你在原文件加几行空行试试。。。




精简
=> 个人网志
2009-2-8 14:32
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

真的连空行也没了,谢谢


2009-2-8 14:38
查看资料  发短消息  网志   编辑帖子  回复  引用回复
jmzhwf
新手上路





积分 16
发帖 11
注册 2009-2-4
状态 离线
『第 11 楼』:   使用 LLM 解释/回答一下

在文件的后面加上几个TAB键试下


2009-2-8 14:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
dejoy
初级用户





积分 76
发帖 64
注册 2008-4-24
状态 离线
『第 12 楼』:   使用 LLM 解释/回答一下

jmzhwf兄,你的方法我试过了, 目的是要删除空格,从视觉上来说,space 及 tab都属空格,所以不分彼此,一视同仁


2009-2-8 14:46
查看资料  发短消息  网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 13 楼』:   使用 LLM 解释/回答一下

fr -ric:"^\s*|\s*\r\n$|^\r\n" /t a.txt


用FR试试;http://www.cn-dos.net/forum/attachment.php?aid=4562&checkid=9cba9&download=1

http://upload.cn-dos.net/img/1282.rar

Last edited by yishanju on 2009-2-9 at 06:01 ]





有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-2-9 05:27
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: