中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-24 13:22
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 文件的文字与字母替换问题? 查看 5,861 回复 29
16 发表于 2006-10-16 10:37 ·  中国 四川 成都 移动
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  看来set命令无法区分大小写,纯批处理恐怕难以实现,楼主还是去试试无奈何兄提供的sed命令吧,没必要强求用纯批处理来解决吧?
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
17 发表于 2006-10-16 11:20 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
19年会员
UID 58987
来自 湖南.娄底
状态 离线
在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 ]
18 发表于 2006-10-16 11:37 ·  中国 四川 成都 移动
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  pengfei 的代码是通过探测每一个字符来替换的,用了 if 可以区别大小写的特性,思路确实不错。

  使用这段代码来处理小块文本内容还是可行的,如果文本内容很多的话,速度就会比较慢了。楼主可以综合考虑一下。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
19 发表于 2006-10-16 11:41 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
Originally posted by zouzhxi at 2006-10-15 22:51:
TO redtek:
这是别人给我的一个文件,,告诉我说,只要用特定字符替换掉里边的字母数字就可以知道是什么东东了.我也没办法,,,,

TO lxmxn:
你说用记事本 ...


别人给你的这个文件,用个工具替换一下就可以~:)
因为这只是一次性的,你的朋友或许给你这样类型的文件只有这一次,不会经常,
而且解码要求只有一小部分,就是做完了自动处理也只是个半成品,
(从心理因素讲:做半成品给朋友用自己也接受不了,没有挑战性和成就感,象是在打杂儿)
(       就像是走了一半将要到美丽公园的路,而中途不去就回家了一样,哈哈)

一次的文件还是用一些工具替换比较好~:)

但我猜这可能不是一次性的文件处理,
有可能是SQL存储上要用的私人性质编码和解码、
或是某个JavaScript上要用到的简单加密方式、
或是聊天要用到的明文简单加密编码,可能防止特殊字符或命令过滤或方便处理、
或是自定义上的象BASE64一样的编码和解码的应用、
或是某种日记等带有保密性的文档的自定义私有编码与解码等、
或是公司内部要求对某个文件内容进行的类似性的解码(如输入法、对照码表……)

所以,实际你上面的问题,如果每行数量不固定,如果有上万行,还含有特殊符号,等等……很多问题都会影响批处理的解决速度和解决办法。
例:几万行和几行的处理方法和算法也是不一样的:)

所以,如果你的内容不保密可以全上传上来让大家帮助你一起想办法。
请说明这件事的非常详细的应用(如果没有私人或企业秘密等条件所约束的话)~:)


) 一次的转换还是用工具好~:)
) 天天要用到的用批处理或调用工具的方便~:)
) 必须要用DOS而不是其它外部工具,这不太明白……(似乎要经常处理这些对吧?)
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
20 发表于 2006-10-17 01:20 ·  IANA 局域网IP(Private-Use)
中级用户
★★
蝴蝶之吻
积分 430
发帖 177
注册 2006-09-20 12:00
19年会员
UID 63170
来自 广东深圳
状态 离线
TO redtek:

是的,我朋友发给我的文件都是这样的,我不得不重复翻出来,所以我想写一个批处理,,,不想用其他工具(因为烦琐),批处理我一次执行就可以了....
21 发表于 2006-10-21 04:16 ·  IANA 局域网IP(Private-Use)
中级用户
★★
蝴蝶之吻
积分 430
发帖 177
注册 2006-09-20 12:00
19年会员
UID 63170
来自 广东深圳
状态 离线
『第 17 楼』:

在9楼namejm版主代码的基础上修改了一下, 可以区别大小写.
CODE:
--------------------------------------------------------------------------------

@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



我弄了好久,用上面的办法太慢了。不太理想。有没有精简一点的,。。
22 发表于 2006-10-21 22:38 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
还有一种方法(只是原理):


) 读全部变量到数组(可以模拟出数组功能来)
) 以数组内容为目的标签直接跳转

) 大写A与小写a同样指向标签A,在标签A内用IF判断大小写并替换
  优点:二选一的方式只针对指定的字母,节省了每个字母都用IF判断的时间。

     也就是说:只要替换内容分为大小写的,一次判断就够:
     因为:如果 IF判断字母为大写(每个数组只装一个字符,省去了:~的提取运算),
        那么就按大写的方式替换,否则一定是小写!所以一次判断解决。

  如果是遇到其它符号,不管!反正是按数组内容跳标签的,到了属于它的标签内想怎么操作就怎么替换。

) 当数组全部走一遍之后,意味着内存中的数组内变量已全部更改替换完成
) 然后for循环再将数组内容从头到尾写回文件。

 
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
23 发表于 2006-10-21 22:46 ·  中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
例如:

) 提取全部文本到数组,每个字符占一个数组元素。

) 以下面标签跳转:

  CALL :数组元素1的内容
 
  就上面这一行就足够了:)


  在下面是标签:

  :A
     在标签A内来一个IF判断它是不是大写(是:替换什么字符),
     如果它不是大写,那一定是小写,替换什么。
     (所以这里一个判断就地了)
 
  :1  在1的标签内,不要判断了,直接替换就行了。
     优点: 通用,想替什么就替什么。

) 还有多少个要替换的内容往标签上加:)


) 最后当数组循环全走了一遍以后,一个FOR写文本内。
  至于写进文本内的内容是不是一个元素就占一行的问题(要多少个元素占一行)
  同样可以计算和 += 什么出来。
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
24 发表于 2006-11-12 19:06 ·  中国 浙江 杭州 滨江区 电信
新手上路
积分 2
发帖 1
注册 2006-11-12 17:54
19年会员
UID 70344
性别 男
状态 离线
用记事本的替换功能好了。
25 发表于 2006-11-13 01:29 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
sed 解决这类问题最爽了
26 发表于 2006-11-15 03:58 ·  IANA 局域网IP(Private-Use)
中级用户
★★
蝴蝶之吻
积分 430
发帖 177
注册 2006-09-20 12:00
19年会员
UID 63170
来自 广东深圳
状态 离线
这个问题差点忘了,,,
此问题未解决,,,
本人还在郁闷,,,
有没有更好的办法,,,
。。。。
27 发表于 2006-11-16 03:58 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
无奈何斑竹发的很详细了,怎么还没有解决?
28 发表于 2006-11-16 04:00 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
不嫌麻烦可以这样写:

sed "s/A/啊/g;s/a/阿/g;......................" life (..........继续添加)
29 发表于 2006-11-23 06:30
中级用户
★★
DOS之日
积分 337
发帖 161
注册 2006-11-04 05:27
19年会员
UID 69523
性别 男
状态 离线
没说的,顶一下
for /f %%h in (`echo hxuan`) do for /f %%x in (`echo hxuan`) do if %%h==%%x nul
30 发表于 2007-09-06 09:49 ·  中国 广东 汕头 电信
新手上路
积分 4
发帖 2
注册 2007-08-31 03:11
18年会员
UID 96233
性别 男
状态 离线
文本文档里不是有查找替换功能?
论坛跳转: