Board logo

标题: 新的删除空格问题?? [打印本页]

作者: amio     时间: 2008-5-29 20:00    标题: 新的删除空格问题??

----------------------
aaa bbb
[abcd]
aaa bbb

cc dd
-------------------------
处理后变为
-----------------------
aaa bbb

[abcd]
aaa bbb
cc dd
---------------------
字符中间空格不要删除,并且让带有 [] 的 上面空一行
作者: bat-zw     时间: 2008-5-29 20:17

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    set str=%%i
    if "!str!" equ "[abcd]" (
       echo.&echo !str!
       ) else (
       echo !str!
    )
)
pause>nul

作者: amio     时间: 2008-5-29 20:26


  Quote:
Originally posted by zw19750516 at 2008-5-29 08:17 PM:
[code]
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    set str=%%i
    if "!str!" equ "[abcd]" (
       echo.&echo !str ...

能不能把 "[abcd]"   换成 万能的     因为 还有 [efgh]   [ijk]  之类的  

获取 "["  ?
作者: WANKOILZ     时间: 2008-5-29 20:27
我发现一个更简洁的:
@echo off
for /f "delims=" %%i in (1.txt) do (
if %%i==[abcd] echo.
echo %%i
)
pause>nul

作者: 26933062     时间: 2008-5-29 20:30

@echo off
for /f "delims=" %%a in (a.txt) do (
   if "%%a"=="[abcd]" echo.
   echo %%a
)
pause

作者: 26933062     时间: 2008-5-29 20:32
晕,发帖后发现我以是5楼了,还以为是在3楼呢?
和4楼的一模一样。哈哈。。。
作者: WANKOILZ     时间: 2008-5-29 20:41
我的还少了四个引号,呵呵........
作者: amio     时间: 2008-5-29 20:47
[abcd]  这个不光是一个啊    还有 [efgh]   [ijk]  之类的  

如果要有几十个 []  一个个 添加太麻烦啊
作者: WANKOILZ     时间: 2008-5-29 20:51
楼上说的这种情况还要具体情况具体分析才行。
作者: amio     时间: 2008-5-29 21:16
不能就以 [  做判断吗    如果有[   就在上面空一行
作者: WANKOILZ     时间: 2008-5-29 21:20
如果行的第一个字符就是[的话,用字符截取+判断就行了吧:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
set "str=%%i"
if "!str:~0,1!"=="[" echo.
echo %%i
)
pause>nul
[ Last edited by WANKOILZ on 2008-5-29 at 09:22 PM ]
作者: zqz0012005     时间: 2008-5-29 21:24

@echo off
for /f "delims=" %%i in (1.txt) do (
echo %%i|findstr "^[.*]$">nul&&echo.
echo %%i
)
pause>nul

作者: 26933062     时间: 2008-5-29 21:35


  Quote:
Originally posted by zqz0012005 at 2008-5-29 21:24:
@echo off
for /f "delims=" %%i in (1.txt) do (
echo %%i|findstr "^[.*]$">nul&&echo.
echo %%i
)
pause>nul

呵呵,楼上的就真的存在效率问题了。
作者: amio     时间: 2008-5-29 21:39


  Quote:
Originally posted by 26933062 at 2008-5-29 09:35 PM:

呵呵,楼上的就真的存在效率问题了。

那个我试  根本就不好使   。
作者: amio     时间: 2008-5-29 21:49
还有个问题  

如果每行 前面有空格 也删除  ?

     aaaaaaa
bbbbbbbbb
-----------------

aaaaaaa
bbbbbbbbb
作者: zqz0012005     时间: 2008-5-29 21:54


  Quote:
Originally posted by 26933062 at 2008-5-29 09:35 PM:

呵呵,楼上的就真的存在效率问题了。

我也考虑过效率问题

只是想过另外一个问题:系统处理!str:~0,1!进行变量截取时不需要花时间吗?

结合大家的讨论,变量截取的效率可能比findstr高吧

我觉得WANKOILZ兄的还应该完善一下
if "!str:~0,1!"=="[" if "!str:~-1"=="]" echo.

[ Last edited by zqz0012005 on 2008-5-29 at 09:56 PM ]
作者: WANKOILZ     时间: 2008-5-29 21:58
呵呵,我只是想针对楼主那种简单形式的文本,就没用完善的方法,管道+findstr会降低效率。当然要考虑周全也只有用findstr了。
作者: amio     时间: 2008-5-29 22:02
我那不是简单的文本   就是改inf 文件

先帮我看看  15楼的问题吧
作者: 26933062     时间: 2008-5-29 22:07
判断有 [ 符号就显示一空行。
:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (a.txt) do (
   set "str=%%a"
   set "str=!str:[=!"
   if not "%%a"=="!str!" echo.
   echo %%a
)
pause

作者: WANKOILZ     时间: 2008-5-29 22:16
同时去掉行前面的空格:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
echo %%i|findstr "^\[.*\]$">nul&&echo.
for %%j in (%%i) do set str=!str! %%j
echo !str:~1!&set str=
)
pause>nul
[ 和 ] 符号在findstr里用作普通符号的话要用 \ 转义才行,26和zq兄忽视了,我也是测试前面的代码后发现的。

[ Last edited by WANKOILZ on 2008-5-29 at 10:27 PM ]
作者: 26933062     时间: 2008-5-29 22:23
19 楼代码可以去掉行前面的空格啊。。。。。
echo %%i|findstr "^\[.*\]$">nul   此种方法效率很低啊。
作者: amio     时间: 2008-5-29 22:25


  Quote:
Originally posted by WANKOILZ at 2008-5-29 10:16 PM:
同时去掉行前面的空格:[code]@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
echo %%i|findstr "^\[.*\]$">nul&&echo.
fo ...

这个  测试 。。。  


    cc dd   会把cc  一起给删掉
作者: WANKOILZ     时间: 2008-5-29 22:29
回楼上:已经改进,但是不如26933062的好用,tokens=*是保证去掉行前的空格,并且后面的数据不变,应该是最好的方法了。
至于findstr "^\[.*\]$">nul  这种格式我也是第一次用,但是"^[.*]$"这种格式不行呢。
作者: zqz0012005     时间: 2008-5-29 22:30
忘记了“[”、“]”在findstr中是特殊字符

tokens=*去掉行首空格,小楼总能别出心裁,果然经济实惠!

[ Last edited by zqz0012005 on 2008-5-29 at 10:32 PM ]
作者: 26933062     时间: 2008-5-29 22:35
完全匹配 [.....]  的方法
@echo off
for /f "delims=:" %%a in ('findstr /n ".*\[..*\]" a.txt') do set .%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
   if defined .%%a echo.
   for /f "tokens=*" %%i in ("%%b") do echo.%%i
)
pause

作者: WANKOILZ     时间: 2008-5-29 22:45
楼上方法真独特。
但是我对 .*\[..*\]  不解:
1、为什么后面不加 .* 如:.*\[..*\].*
2、..* 这里的两点是什么意思呢。
劳驾楼上讲解下。
作者: amio     时间: 2008-5-29 22:51
还有个问题。。。

能不能删除  ;  打头的行  就是注释  而不删除字符中间夹着的 ;

; asdasdasd
asd;asd
;   qweqewqwe
---------------------------
asd;asd
作者: 26933062     时间: 2008-5-29 22:52
*代表重复前面字符的0或n次
.代表至少一个字符。
如果是".*\[.*\]" 这样的话,那么也匹配 [] 这样的结果了。即:[]中间没有内容也匹配了。
作者: WANKOILZ     时间: 2008-5-29 22:57


  Quote:
*代表重复前面字符的0或n次
.代表至少一个字符。
如果是".*\[.*\]" 这样的话,那么也匹配 [] 这样的结果了。即:[]中间没有内容也匹配了。

说的很清楚,感谢了。
还有,再劳驾:为什么不在后面再加个 .*  形如:".*\[..*\].*" ,这样和不加有什么区别?

回27楼:25楼的代码符合你的要求

[ Last edited by WANKOILZ on 2008-5-29 at 10:59 PM ]
作者: zqz0012005     时间: 2008-5-29 23:01
如果后面再加个 .*,则像[reg]add这样不是以]结尾的行也会匹配,而这样的行不是楼主想的要吧
作者: 26933062     时间: 2008-5-29 23:04


  Quote:
还有,再劳驾:为什么不在后面再加个 .*  形如:".*\[..*\].*" ,这样和不加有什么区别?
...

.*\[..*\] 只要符号条件就已经匹配了,所以不用管[] 后面是否还有内容
[]后面加.*意思是[]后面有或无内容都匹配。
但若是".*\[..*\]..*" 就不一样了。表示[]后面至少还要有一个字符

回27楼:  eol=;

[ Last edited by 26933062 on 2008-5-29 at 11:06 PM ]
作者: WANKOILZ     时间: 2008-5-29 23:18
哦,就是,.*\[..*\] 只要符号条件就已经匹配了,想通了,非常感谢。
for /f 不是默认就忽略 ; 开头的行么。
作者: amio     时间: 2008-5-29 23:21
这样输出  为什么 [ 的空行就不会空了呢  只会吧; 和全部的空格删除
@echo off
for /f "delims=:" %%a in ('findstr /n ".*\[..*\]" a.txt') do set .%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
   if defined .%%a echo.
   for /f "tokens=*" %%i in ("%%b") do echo.%%i>>temp.txt
)
作者: amio     时间: 2008-5-29 23:24


  Quote:
Originally posted by zqz0012005 at 2008-5-29 11:01 PM:
如果后面再加个 .*,则像[reg]add这样不是以]结尾的行也会匹配,而这样的行不是楼主想的要吧

侥幸吧   我修改的文件里  没有这些
作者: WANKOILZ     时间: 2008-5-29 23:28
加不加 .* 都匹配[reg]add。因为.*可以是什么都没有,但..*就表示至少要有一个字符。
作者: amio     时间: 2008-5-29 23:34
希望 26933062  兄弟 在给一个完整的代码

[  ;   还有每行字符前面空格   以及除  [  空格外  删除其他全部空格 。。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: 26933062     时间: 2008-5-29 23:36


  Quote:
Originally posted by amio at 2008-5-29 23:34:
希望 26933062  兄弟 在给一个完整的代码

[  ;   还有每行字符前面空格   以及除  [  空格外  删除其他全部空格 。。。。。。。。。。。。。。。。。。。。。。。。。。。

你的变化太多,解决了一个又来一个,
况且 你楼上的   简语    我看不懂。
作者: amio     时间: 2008-5-30 13:51


  Quote:
Originally posted by 26933062 at 2008-5-29 11:36 PM:

你的变化太多,解决了一个又来一个,
况且 你楼上的   简语    我看不懂。

@echo off
for /f "delims=:" %%a in ('findstr /n ".*\[..*\]" a.txt') do set .%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
   if defined .%%a echo.
   for /f "tokens=*" %%i in ("%%b") do echo.%%i
)

这个代码基本已经可以实现我说的了  如何输出  ?
作者: WANKOILZ     时间: 2008-5-31 12:21
回楼上,晕!!
@echo off
for /f "delims=:" %%a in ('findstr /n ".*\[..*\]" a.txt') do set .%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
   if defined .%%a echo.>>a.txt
   for /f "tokens=*" %%i in ("%%b") do echo.%%i>>a.txt
)

在echo后面加个>>就行了........
作者: amio     时间: 2008-5-31 12:52


  Quote:
Originally posted by WANKOILZ at 2008-5-31 12:21 PM:
回楼上,晕!!
@echo off
for /f "delims=:" %%a in ('findstr /n ".*\[..*\]" a.txt') do set .%%a=a
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
  ...

我试过这样 有的功能不能都实现
作者: FQ     时间: 2008-5-31 13:29
去掉左右空格:
3.txt
  I am robert     
       what are you doing ???            
oh,I teach batch   
测试代码:
@echo off&setlocal
echo.处理之前:
for /f "delims=" %%a in (3.txt) do echo.[%%a]
echo 处理之后:
for /f "tokens=*" %%b in (3.txt) do call:FQ "%%b"
goto:eof
:FQ
echo [%~n1]