标题: 新的删除空格问题??
[打印本页]
作者: 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]