找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: batman

【练习-037】批处理去除文本行前后的空格

[复制链接]
发表于 2009-8-15 20:51:52 | 显示全部楼层

回复 15楼 的帖子

之所以不用call,是以为随风在一篇讨论效率的帖子中说过,如果出现这种方式(call, set hh=%%str:!str1!=!str1!#%%),还是用for的好。
具体参看:
http://bbs.bathome.net/viewthrea ... ght=%2B%CB%E6%B7%E7
发表于 2009-8-15 21:04:28 | 显示全部楼层

今天回到家了,我也来凑个数^_^

  1. @echo off
  2. for /f "tokens=* delims= " %%s in (a.txt) do call :str %%s
  3. pause
  4. :str
  5. echo "%*"
复制代码

评分

参与人数 2PB +15 收起 理由
zhouyongjun + 5 赞一个
batman + 10 巧妙地利用了call参数,高!

查看全部评分

 楼主| 发表于 2009-8-15 21:07:11 | 显示全部楼层
&&修改下我顶楼的代码,顶楼原来是想通用一系列的技巧来简化代码,
结果是付出了效率上的代价,现提高代码运行效率如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.     for /f "tokens=*" %%a in ("%%a") do set "str=%%a"&set "str=!str: = # !"&set "var="
  4.     for %%a in (!str!) do set "var=%%a!var!"
  5.     set "var=!var:#= !"
  6.     for /f "tokens=*" %%a in ("!var!") do set "str=%%a"&set "str=!str: = # !"&set "var="
  7.     for %%a in (!str!) do set "var=%%a!var!"
  8.     echo "!var:#= !"
  9. )
  10. pause>nul
复制代码
发表于 2009-8-15 21:47:49 | 显示全部楼层
综合一下,还可如下
@echo off
for /f "tokens=* delims= " %%s in (a.txt) do echo "%%~nxs"
pause
发表于 2009-8-16 00:32:45 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (a.txt) do set "var=%%a"&call :loop&echo "!var!">>b.txt
  3. goto :eof
  4. :loop
  5. set "check=!var:~-1!"&if "!check!"==" " set "var=!var:~0,-1!"&goto loop
复制代码

[ 本帖最后由 Lumiere 于 2009-8-16 00:36 编辑 ]
发表于 2009-8-16 20:38:50 | 显示全部楼层
原帖由 wxcute 于 2009-8-15 21:04 发表
@echo off
for /f "tokens=* delims= " %%s in (a.txt) do call :str %%s
pause
:str
echo "%*"

你的delims= 似乎是多余的吧?tokens=*不是不会分节字符串的么?
还有啊,%*我现在还不是太明白,能给讲解一下么
发表于 2009-8-16 21:12:07 | 显示全部楼层
不考虑特殊字符的话 call出来 echo %* 效率可以
利用%%~nxi扩展的话 路径的处理上也有问题
我再用替换法  发现效率比不上echo %*
文本中有一个引号的话也出错 两引号之间没空格可以处理
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in (a.txt) do (
  3.     set var=%%i&set str=&set "k= "
  4.     set "var=!var: =" "!"
  5.     for %%a in ("!var!") do if %%a neq "" (
  6.         set "str=!str!!k!%%~a"&set "k= "
  7.       ) else set "k= !k!"
  8.         echo "!str:~1!"
  9.    )
  10. pause
复制代码
发表于 2010-10-28 14:22:14 | 显示全部楼层

回复 7楼 的帖子

  1. @echo on&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in (a.txt) do (
  3.         md "d:\2\%%i")
  4. for /f "delims=" %%i in ('dir /b "d:\2"') do echo "%%i">>2.txt
  5. rd/s/q d:\2\
  6. pause
复制代码
发表于 2011-7-20 19:34:35 | 显示全部楼层
参照2楼的算法,但不知道原理。
  1. @echo off
  2. For /f "Tokens=*" %%i in (a.txt) do (For /f "tokens=*" %%a in ("%%i") do Echo "%%~nxa")
  3. pause
复制代码
发表于 2011-9-3 13:16:18 | 显示全部楼层
有分加那么好??
  1. sed -e "s/^[ ]*//;s/[ ]*$//;s/\(.*\)/"\1"/" test.txt
复制代码
发表于 2011-9-3 20:39:52 | 显示全部楼层
回复 5# keen


    你这个还好理解些,但到这里就想不通了。  为什么有个#号?如果有时间每句给解释下就有富了

for %%h in (!str1!) do (

        for %%m in (!str1!#) do set hh=!str:%%h=%%m!

        for /f "delims=#" %%x in ("!hh!") do echo "%%x"
发表于 2011-9-26 19:44:43 | 显示全部楼层
&&修改下我顶楼的代码,顶楼原来是想通用一系列的技巧来简化代码,
结果是付出了效率上的代价,现提高代码 ...
batman 发表于 2009-8-15 21:07



有点不完美. 空行带空格的还得输出一个空格
发表于 2012-7-5 12:29:59 | 显示全部楼层
  1. 发个sed的
  2. #!/bin/bash
  3. # Fri Jun 22 15:43:42 CST 2012
  4. # Sun Jul  1 19:52:32 CST 2012
  5. # The code is listed as follows
  6. echo >uu.txt
  7. sed 's/^\s*\(.*[a-z]\)\s*$/\1/g' temp > uu.txt
  8. exit
复制代码
发表于 2018-11-6 09:12:21 | 显示全部楼层
本帖最后由 踏沙行 于 2018-11-6 09:17 编辑

回复 2# netbenton
旧贴重提,不知道论坛是否有禁止性规定?
使用扩展变量%~nx,固定速度快,但是假如,文本中包含有路径符号 \ 的话,就悲剧了。
比如:1.txt内容如下:
   A11 !b11 H\c11 ^E
      A13 B13\22\123 #C13 E
发表于 2018-11-6 09:14:57 | 显示全部楼层
本帖最后由 踏沙行 于 2018-11-6 09:19 编辑
wxcute 发表于 2009-8-15 21:04

原贴代码:
  1. @echo off
  2. for /f "tokens=* delims= " %%s in (a.txt) do call :str %%s
  3. pause
  4. :str
  5. echo "%*"
复制代码
这个方法也很好,但是有个困惑:怎么取得返回值?
如果我想把每行首尾的空格去掉后,再将结果返回给主程序中的某个变量,该怎么实现?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:04 , Processed in 0.023628 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表