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 "" (
echo.&echo !str!
) else (
echo !str!
)
)
pause>nul

作者: amio     时间: 2008-5-29 20:26
Originally posted by zw19750516 at 2008-5-29 08:17 PM:

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
set str=%%i
if "!str!" equ "" (
echo.&echo !str ...




能不能把 "" 换成 万能的 因为 还有 之类的

获取 "

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

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

@echo off
for /f "delims=" %%a in (a.txt) do (
if "%%a"=="" 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!"=="




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
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
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
Originally posted by 26933062 at 2008-5-29 09:35 PM:

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


我也考虑过效率问题

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

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

我觉得WANKOILZ兄的还应该完善一下
if "!str:~0,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:





作者: 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
Originally posted by WANKOILZ at 2008-5-29 10:16 PM:
同时去掉行前面的空格:
@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
*代表重复前面字符的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

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

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

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



侥幸吧 我修改的文件里 没有这些

作者: WANKOILZ     时间: 2008-5-29 23:28
加不加 .* 都匹配[reg]add。因为.*可以是什么都没有,但..*就表示至少要有一个字符。

作者: amio     时间: 2008-5-29 23:34
希望 26933062 兄弟 在给一个完整的代码

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

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


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

作者: amio     时间: 2008-5-30 13:51
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
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.
echo 处理之后:
for /f "tokens=*" %%b in (3.txt) do call:FQ "%%b"
goto:eof
:FQ
echo