|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
16 楼』:
看来set命令无法区分大小写,纯批处理恐怕难以实现,楼主还是去试试无奈何兄提供的sed命令吧,没必要强求用纯批处理来解决吧?
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-10-16 10:37 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
17 楼』:
在9楼namejm版主代码的基础上修改了一下, 可以区别大小写.
@echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
set var=%%i
call :go
set "var=!var:1=o!"
set "var=!var:2=e!"
set "var=!var:3=u!"
set "var=!var:4=i!"
set "var=!var:5=u!"
set "var=!var:6=v!"
set "var=!var:7=l!"
set "var=!var:9=y!"
>>2.txt echo !var!
)
start 2.txt
exit
:go
set tmp=%var%@
set var=
:go_
if not "%tmp:~0,1%"=="@" (
set var_=%tmp:~0,1%
if "!var_!"=="A" set var_=啊
if "!var_!"=="a" set var_=阿
if "!var_!"=="B" set var_=不
if "!var_!"=="b" set var_=把
if "!var_!"=="C" set var_=才
if "!var_!"=="c" set var_=出
set var=!var!!var_!
set tmp=!tmp:~1!
goto go_
)
goto :eof [ Last edited by pengfei on 2006-10-16 at 21:36 ]
|
|
2006-10-16 11:20 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
18 楼』:
pengfei 的代码是通过探测每一个字符来替换的,用了 if 可以区别大小写的特性,思路确实不错。
使用这段代码来处理小块文本内容还是可行的,如果文本内容很多的话,速度就会比较慢了。楼主可以综合考虑一下。
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-10-16 11:37 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
19 楼』:
Quote: | Originally posted by zouzhxi at 2006-10-15 22:51:
TO redtek:
这是别人给我的一个文件,,告诉我说,只要用特定字符替换掉里边的字母数字就可以知道是什么东东了.我也没办法,,,,
TO lxmxn:
你说用记事本 ... |
|
别人给你的这个文件,用个工具替换一下就可以~:)
因为这只是一次性的,你的朋友或许给你这样类型的文件只有这一次,不会经常,
而且解码要求只有一小部分,就是做完了自动处理也只是个半成品,
(从心理因素讲:做半成品给朋友用自己也接受不了,没有挑战性和成就感,象是在打杂儿)
( 就像是走了一半将要到美丽公园的路,而中途不去就回家了一样,哈哈)
一次的文件还是用一些工具替换比较好~:)
但我猜这可能不是一次性的文件处理,
有可能是SQL存储上要用的私人性质编码和解码、
或是某个JavaScript上要用到的简单加密方式、
或是聊天要用到的明文简单加密编码,可能防止特殊字符或命令过滤或方便处理、
或是自定义上的象BASE64一样的编码和解码的应用、
或是某种日记等带有保密性的文档的自定义私有编码与解码等、
或是公司内部要求对某个文件内容进行的类似性的解码(如输入法、对照码表……)
所以,实际你上面的问题,如果每行数量不固定,如果有上万行,还含有特殊符号,等等……很多问题都会影响批处理的解决速度和解决办法。
例:几万行和几行的处理方法和算法也是不一样的:)
所以,如果你的内容不保密可以全上传上来让大家帮助你一起想办法。
请说明这件事的非常详细的应用(如果没有私人或企业秘密等条件所约束的话)~:)
) 一次的转换还是用工具好~:)
) 天天要用到的用批处理或调用工具的方便~:)
) 必须要用DOS而不是其它外部工具,这不太明白……(似乎要经常处理这些对吧?)
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-10-16 11:41 |
|
|
zouzhxi
中级用户
蝴蝶之吻
积分 430
发帖 177
注册 2006-9-20 来自 广东深圳
状态 离线
|
|
2006-10-17 01:20 |
|
|
zouzhxi
中级用户
蝴蝶之吻
积分 430
发帖 177
注册 2006-9-20 来自 广东深圳
状态 离线
|
『第
21 楼』:
Quote: | 『第 17 楼』:
在9楼namejm版主代码的基础上修改了一下, 可以区别大小写.
CODE: [Copy to clipboard]
--------------------------------------------------------------------------------
Quote: | @echo off
cd.>2.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in (test.txt) do (
set var=%%i
call :go
set "var=!var:1=o!"
set "var=!var:2=e!"
set "var=!var:3=u!"
set "var=!var:4=i!"
set "var=!var:5=u!"
set "var=!var:6=v!"
set "var=!var:7=l!"
set "var=!var:9=y!"
>>2.txt echo !var!
)
start 2.txt
exit
:go
set tmp=%var%@
set var=
:go_
if not "%tmp:~0,1%"=="@" (
set var_=%tmp:~0,1%
if "!var_!"=="A" set var_=啊
if "!var_!"=="a" set var_=阿
if "!var_!"=="B" set var_=不
if "!var_!"=="b" set var_=把
if "!var_!"=="C" set var_=才
if "!var_!"=="c" set var_=出
set var=!var!!var_!
set tmp=!tmp:~1!
goto go_
)
goto :eof |
|
|
|
我弄了好久,用上面的办法太慢了。不太理想。有没有精简一点的,。。
|
Butterfly Kiss Blog
计算机DIY联盟论坛 |
|
2006-10-21 04:16 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
22 楼』:
还有一种方法(只是原理):
) 读全部变量到数组(可以模拟出数组功能来)
) 以数组内容为目的标签直接跳转
) 大写A与小写a同样指向标签A,在标签A内用IF判断大小写并替换
优点:二选一的方式只针对指定的字母,节省了每个字母都用IF判断的时间。
也就是说:只要替换内容分为大小写的,一次判断就够:
因为:如果 IF判断字母为大写(每个数组只装一个字符,省去了:~的提取运算),
那么就按大写的方式替换,否则一定是小写!所以一次判断解决。
如果是遇到其它符号,不管!反正是按数组内容跳标签的,到了属于它的标签内想怎么操作就怎么替换。
) 当数组全部走一遍之后,意味着内存中的数组内变量已全部更改替换完成
) 然后for循环再将数组内容从头到尾写回文件。
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-10-21 22:38 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
23 楼』:
例如:
) 提取全部文本到数组,每个字符占一个数组元素。
) 以下面标签跳转:
CALL :数组元素1的内容
就上面这一行就足够了:)
在下面是标签:
:A
在标签A内来一个IF判断它是不是大写(是:替换什么字符),
如果它不是大写,那一定是小写,替换什么。
(所以这里一个判断就地了)
:1 在1的标签内,不要判断了,直接替换就行了。
优点: 通用,想替什么就替什么。
) 还有多少个要替换的内容往标签上加:)
) 最后当数组循环全走了一遍以后,一个FOR写文本内。
至于写进文本内的内容是不是一个元素就占一行的问题(要多少个元素占一行)
同样可以计算和 += 什么出来。
|
Redtek,一个永远在网上流浪的人……
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |
|
2006-10-21 22:46 |
|
|
95219320
新手上路
积分 2
发帖 1
注册 2006-11-12
状态 离线
|
|
2006-11-12 19:06 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
|
2006-11-13 01:29 |
|
|
zouzhxi
中级用户
蝴蝶之吻
积分 430
发帖 177
注册 2006-9-20 来自 广东深圳
状态 离线
|
|
2006-11-15 03:58 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
27 楼』:
无奈何斑竹发的很详细了,怎么还没有解决?
|
|
2006-11-16 03:58 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
28 楼』:
不嫌麻烦可以这样写:
sed "s/A/啊/g;s/a/阿/g;......................" life (..........继续添加)
|
|
2006-11-16 04:00 |
|
|
hxuan999
中级用户
DOS之日
积分 337
发帖 161
注册 2006-11-4
状态 离线
|
『第
29 楼』:
没说的,顶一下
|
for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul |
|
2006-11-23 06:30 |
|
|
myddos
新手上路
积分 4
发帖 2
注册 2007-8-31
状态 离线
|
『第
30 楼』:
文本文档里不是有查找替换功能?
|
|
2007-9-6 09:49 |
|