中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 文件的文字与字母替换问题? 上一主题 | 下一主题
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
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
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
来自 广东深圳
状态 离线
『第 20 楼』:  

TO redtek:

是的,我朋友发给我的文件都是这样的,我不得不重复翻出来,所以我想写一个批处理,,,不想用其他工具(因为烦琐),批处理我一次执行就可以了....



Butterfly Kiss Blog
计算机DIY联盟论坛
2006-10-17 01:20
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
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
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
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
状态 离线
『第 24 楼』:  

用记事本的替换功能好了。

2006-11-12 19:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 25 楼』:  

sed 解决这类问题最爽了

2006-11-13 01:29
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
zouzhxi
中级用户

蝴蝶之吻


积分 430
发帖 177
注册 2006-9-20
来自 广东深圳
状态 离线
『第 26 楼』:  

这个问题差点忘了,,,
此问题未解决,,,
本人还在郁闷,,,
有没有更好的办法,,,
。。。。



Butterfly Kiss Blog
计算机DIY联盟论坛
2006-11-15 03:58
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
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
查看资料  发送邮件  发短消息 网志  OICQ (33899867)  编辑帖子  回复  引用回复
myddos
新手上路





积分 4
发帖 2
注册 2007-8-31
状态 离线
『第 30 楼』:  

文本文档里不是有查找替换功能?

2007-9-6 09:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: