中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何替换字符串中的某一部分字符
作者:
标题: [已结]如何替换字符串中的某一部分字符 上一主题 | 下一主题
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『楼 主』:  [已结]如何替换字符串中的某一部分字符

我想将下列文本中的d:\dos 替换成 另外一个路径 f:\new 该怎么做啊?

========================
d:\dos\35选7.bat
d:\dos\CMD 命令速查手册.cmd
d:\dos\cmd_help.htm
d:\dos\game\game.bat
d:\dos\Lan\hostname.txt
========================


     希望高手给出一个好的办法,而且要扩展性比较强。比如把此题中d:\dos换成了d:\1\1\1\dos也能够实现。

[ Last edited by zhaxi on 2006-7-1 at 23:09 ]

2006-7-1 16:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  假设你的这段文本保存在test.txt中,把这段代码放到test.txt同名目录下即可。
@echo off
setlocal enabledelayedexpansion
for /f "skip=1 eol== tokens=1,2 delims=." %%i in (test.txt) do (
    echo %%i|find "d:\dos">nul 2>nul && set new=%%i
    echo f:\new\!new:~7!.%%j>>1.txt
)
del /q test.txt
ren 1.txt test.txt
start test.txt


2006-7-1 17:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 3 楼』:  

谢谢你给我提供了!new:~7!这样的好用法。

不过我不能理解你要以 “.” 为分隔符分开成%%i,和%%j,这样做的话如果路径中含有d:\dos\ver3.2\3.txt 时,具有2个 . ,则会语句失效。我把它改成了/,这样还保证会把每行路径都全部传递给%%i,不怕有空格的情形。

@echo off
setlocal enabledelayedexpansion
for /f "eol== tokens=1 delims=/" %%i in (test.txt) do (
    echo %%i|find "d:\dos">nul 2>nul && set new=%%i
    echo f:\new\!new:~7!>>1.txt
)
del /q test.txt
ren 1.txt test.txt
start test.txt

2006-7-1 23:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

Re zhaxi:

  观察你提供的文本文件,并没有在同一行中出现两个点号的情况,所以我要利用一切可利用的条件:)其实,用点号作为分隔符确实存在你说的执行失败的情况,但是因为某些行中存在空格,所以不可能用空格来分隔,此时用点号作分隔符似乎是唯一的选择。

  但是执行你的代码,确实工作得很好,真让我好生疑惑:文本中并没有斜杠符号呀,怎么可以用/作分隔符呢?哪位能解释一下?

2006-7-1 23:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 5 楼』:  

因为根据我观察,所有路径的分割符不都是 \ 吗,不可能出现 / 。 哈哈所以我用它分割可以把每行字符都赋予给%%i啊。

2006-7-2 15:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 6 楼』:  

另外我在想:如果要把这个语句扩展到所有情况,该如何实现。
此处d:\dos\里含有7个字符,如果换成别的目录如d:\dos\dos\则含有11个字符了。

此时可以通过什么语句把一行字符的长度取出来呢?

还望指点。

2006-7-2 16:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 7 楼』:  

哈哈。我有了更好的办法实现这个扩展了。利用%PATH:STR1=STR2%,就不用管d:\dos有多长的字符了。
现在把最终的代码公布如下:
@echo on

:: 比较目录1中存在,目录2中相应位置不存在的文件。
:: %1为目录1
:: %2为目录2

set a=%time%
if exist d:\f1.txt del d:\f1.txt /q
if exist d:\f2.txt del d:\f2.txt /q

dir %1\ /s /b > d:\f1.txt
type d:\f1.txt

cls
setlocal enabledelayedexpansion
for /f "eol== tokens=1 delims=/" %%i in (d:\f1.txt) do (
    echo %%i|find "%1">nul 2>nul && (set new=%%i
                                     set result=!new:%1=%2!   
     if not exist !result!  (echo !result:%2=%1!>>d:\f2.txt)
                                     )         
                                                        )

@echo off
cls
echo.
set  b=%time%
echo 您的比较结果放在d:\f3.txt中。
echo 开始时间:%a%
echo 结束时间:%b%
pause>nul
上述代码保存为compare.bat,使用compare.bat  %1  %2调用就可以了。

[ Last edited by zhaxi on 2006-7-2 at 22:46 ]

2006-7-2 16:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 8 楼』:  

不过还是想问下
“可以通过什么语句把一行字符的长度取出来呢”?

因为不知道用什么做分割符,哈哈

2006-7-2 16:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 9 楼』:  

  在文本中没有出现的字符可以用来做for中的分隔符吗?要是这样也可以的话,我的天呐……我还是没转过弯来。

  统计字符串的字符个数的代码如下(暂时没法统计含有引号的字符串):
@echo off
set str=d:\dos\dos\
:: 字符串中不能出现引号
set num=0
:loop
set str=%str:~0,-1%
set /a num+=1
if not "%str%"=="" goto loop
echo 字符个数为 %num% 个
pause


2006-7-2 17:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 10 楼』:  

你真是厉害。多谢提供代码。
我还以为要用for呢,所以我不知道取哪个分割符。

2006-7-2 22:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 11 楼』:  

Re zhaxi:

  你在7楼的代码还有几处有待修改,分别是:

  @echo on 一句应该改成@echo off,后面的@echo off可以删掉;
  if exist d:\f1.txt del d:\f1.txt /q 一句可以省去,因为后面的dir ……>d:\f1.txt一句中用到了单个的重定向符号>,此句的输出内容会把以前存在的f1.txt覆盖掉;
  dir %1\ /s /b > d:\f1.txt 一句中应该再加上参数 /a,防止漏掉隐藏文件。

2006-7-2 23:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: