Board logo

标题: [已结]如何替换字符串中的某一部分字符 [打印本页]

作者: zhaxi     时间: 2006-7-1 16:44    标题: [已结]如何替换字符串中的某一部分字符

我想将下列文本中的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 ]
作者: namejm     时间: 2006-7-1 17:49
  假设你的这段文本保存在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

作者: zhaxi     时间: 2006-7-1 23:09
谢谢你给我提供了!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
作者: namejm     时间: 2006-7-1 23:52
Re zhaxi:

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

  但是执行你的代码,确实工作得很好,真让我好生疑惑:文本中并没有斜杠符号呀,怎么可以用/作分隔符呢?哪位能解释一下?
作者: zhaxi     时间: 2006-7-2 15:43
因为根据我观察,所有路径的分割符不都是 \ 吗,不可能出现 / 。 哈哈所以我用它分割可以把每行字符都赋予给%%i啊。
作者: zhaxi     时间: 2006-7-2 16:20
另外我在想:如果要把这个语句扩展到所有情况,该如何实现。
此处d:\dos\里含有7个字符,如果换成别的目录如d:\dos\dos\则含有11个字符了。

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

还望指点。
作者: zhaxi     时间: 2006-7-2 16:39
哈哈。我有了更好的办法实现这个扩展了。利用%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 ]
作者: zhaxi     时间: 2006-7-2 16:45
不过还是想问下
“可以通过什么语句把一行字符的长度取出来呢”?

因为不知道用什么做分割符,哈哈
作者: namejm     时间: 2006-7-2 17:20
  在文本中没有出现的字符可以用来做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

作者: zhaxi     时间: 2006-7-2 22:48
你真是厉害。多谢提供代码。
我还以为要用for呢,所以我不知道取哪个分割符。
作者: namejm     时间: 2006-7-2 23:14
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,防止漏掉隐藏文件。