楼 主
[已结]如何替换字符串中的某一部分字符
发表于 2006-07-01 16:44 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
我想将下列文本中的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 ]
第 2 楼
发表于 2006-07-01 17:49 · 中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226 发帖 1,737 注册 2006-03-10 00:38 20年会员 UID 51697 来自 成都
状态 离线
假设你的这段文本保存在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
第 3 楼
发表于 2006-07-01 23:09 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
谢谢你给我提供了!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
第 4 楼
发表于 2006-07-01 23:52 · 中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226 发帖 1,737 注册 2006-03-10 00:38 20年会员 UID 51697 来自 成都
状态 离线
Re zhaxi:
观察你提供的文本文件,并没有在同一行中出现两个点号的情况,所以我要利用一切可利用的条件:)其实,用点号作为分隔符确实存在你说的执行失败的情况,但是因为某些行中存在空格,所以不可能用空格来分隔,此时用点号作分隔符似乎是唯一的选择。
但是执行你的代码,确实工作得很好,真让我好生疑惑:文本中并没有斜杠符号呀,怎么可以用/作分隔符呢?哪位能解释一下?
第 5 楼
发表于 2006-07-02 15:43 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
因为根据我观察,所有路径的分割符不都是 \ 吗,不可能出现 / 。 哈哈所以我用它分割可以把每行字符都赋予给%%i啊。
第 6 楼
发表于 2006-07-02 16:20 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
另外我在想:如果要把这个语句扩展到所有情况,该如何实现。
此处d:\dos\里含有7个字符,如果换成别的目录如d:\dos\dos\则含有11个字符了。
此时可以通过什么语句把一行字符的长度取出来呢?
还望指点。
第 7 楼
发表于 2006-07-02 16:39 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
哈哈。我有了更好的办法实现这个扩展了。利用%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 ]
第 8 楼
发表于 2006-07-02 16:45 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
不过还是想问下
“可以通过什么语句把一行字符的长度取出来呢”?
因为不知道用什么做分割符,哈哈
第 9 楼
发表于 2006-07-02 17:20 · 中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226 发帖 1,737 注册 2006-03-10 00:38 20年会员 UID 51697 来自 成都
状态 离线
在文本中没有出现的字符可以用来做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
第 10 楼
发表于 2006-07-02 22:48 · 中国 广东 珠海 电信
初级用户
★
积分 112 发帖 40 注册 2006-06-23 19:52 20年会员 UID 57473 性别 男
状态 离线
你真是厉害。多谢提供代码。
我还以为要用for呢,所以我不知道取哪个分割符。
第 11 楼
发表于 2006-07-02 23:14 · 中国 四川 成都 鹏博士宽带
荣誉版主
★★★★
batch fan
积分 5,226 发帖 1,737 注册 2006-03-10 00:38 20年会员 UID 51697 来自 成都
状态 离线
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,防止漏掉隐藏文件。
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正