[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 求助,批处理如何替换每行的多个字符串?

我下载了一些网页文件,findstr 可售 bb.txt >1.txt 提取了包含 可售的行,并保存到1.txt,内容如下(行前有空格):
                  <td id="saleinfo" align="center">总售:199套&nbsp;可售:199套</td>
                  <td id="saleinfo" align="center">总售:347套&nbsp;可售:263套</td>
                  <td id="saleinfo" align="center">总售:580套&nbsp;可售:570套</td>
                  <td id="saleinfo" align="center">总售:612套&nbsp;可售:589套</td>
                  <td id="saleinfo" align="center">总售:648套&nbsp;可售:585套</td>
我想将每行,以这样的方式输出
总售;199;可售;199
总售;347;可售;263
总售;580;可售;570
总售;612;可售;589
总售;648;可售;585

--我在这里学了一下,可以用下面的命令达到效果:
copy build*.pub bb.txt
for /f "tokens=2 delims=>" %%a in ('findstr /i /c:"可售" bb.txt') do  echo=%%a >>b1.txt
for /f "tokens=1 delims=</td" %%b in (b1.txt) do  echo=%%b >>b2.txt
for /f "tokens=1-2 delims=套&nbsp;" %%c in (b2.txt) do  echo=%%c;%%d>>b3.txt
for /f "tokens=1-3 delims=:" %%e in (b3.txt) do  echo=%%e;%%f;%%g>>b4.txt
echo=总售;=sum(b1:b1579);可售;=sum(d1:d1579)>>b4.txt
del b1.txt =总售:199套&nbsp;可售:199套</td
del b2.txt=总售:199套&nbsp;可售:199套
del b3.txt=总售:199;可售:199
      b4.txt=总售;199;可售;199

-------上面的方法,都是以关键字,将每行分割成多列,之后提取特定的列,但delims=并不能很好支持长字符串,如下面的第一个。  
我想以变量的方式,替换每行的字符口串为“;”
“                  <td id="saleinfo" align="center">”
“:”
“套”
“&nbsp”
“</td>”

我不想用第三方命令,用下面的方法,能删除变量的前后部分,但对中间的无效,它也不能替换为;号
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (1.txt) do (
set str=%%i
set str=!str:~33,-5!
echo=!str!>>b3.txt
           )

TOP

  1. @echo off
  2. for /f "tokens=3,4,6,7 delims=<>&;:套" %%a in (1.txt) do (
  3.   echo,%%a;%%b;%%c;%%d
  4. )
  5. pause
复制代码

TOP

多谢,不过这还是分割取列的方法。就不能变量替换吗?

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. >b3.txt type nul
  4. for /f "tokens=*" %%i in (a.txt) do (
  5.     set str=%%i
  6.     set str=!str:~33,-5!
  7.     set "str=!str:&nbsp=!"
  8.     set str=!str::=;!
  9.     >>b3.txt echo,!str!
  10. )
复制代码

TOP

5楼的方法,测试可行,先用变量去头尾,解决最麻烦的“                  <td id="saleinfo" align="center">”,之后就方便处理了,多谢了。
只是这第一段,就真不能替换处理吗?

TOP

回复 6# pk987
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. >b3.txt type nul
  4. for /f "tokens=*" %%i in (a.txt) do (
  5.     set str=%%i
  6.     set "str=!str:*总售:=总售;!"
  7.     set "str=!str:</td>=!"
  8.     set "str=!str:&nbsp=!"
  9.     set str=!str::=;!
  10.     >>b3.txt echo,!str!
  11. )
复制代码

TOP

经过测试,如果不用    set str=!str:~33,-5!
改用如下代码,可以得到
==;总售;199;可售;199;
==;总售;347;可售;263;
==;总售;580;可售;570;
==;总售;612;可售;589;
这效果,也够用了。

代码
@echo off
del a2.txt
setlocal enabledelayedexpansion
>a2.txt type nul
for /f "tokens=*" %%i in (1.txt) do (
    set str=%%i
    set "str=!str:&nbsp;=!"
    set str=!str::=;!
    set str=!str:套=;!
    set str=!str:td id=!
    set str=!str:"saleinfo" align=!
    set str=!str:"center"=!
    set str=!str:/td=!
    set "str=!str:<>=!"
    set "str=!str:<=!"
    set "str=!str:>=;!"
    >>a2.txt echo,!str!
)
call exit
    set str=!str:~33,-5!


---谢谢各位的帮助

TOP

本帖最后由 pk987 于 2012-12-31 21:30 编辑

copy build*.pub bb.txt

@echo off
setlocal enabledelayedexpansion
>a0.txt type nul
for /f "tokens=*" %%i in ('findstr /i /c:"可售" bb.txt') do (
    set str=%%i
    set "str=!str:*总售:=总售;!"
    set "str=!str:套</td>=!"
    set "str=!str:套&nbsp=!"
    set str=!str::=;!
    >>a0.txt echo,!str!
)
`call exit



@echo off
>a1.txt type nul
echo=总售;=sum(b2:b3000);可售;=sum(d2:d3000)>>a1.txt
for /f "tokens=3,4,6,7 delims=<>&;:套" %%a in ('findstr /i /c:"可售" bb.txt') do (echo,%%a;%%b;%%c;%%d>>a1.txt)
`call exit




@echo off
setlocal enabledelayedexpansion
>a2.txt type nul
echo=ab;总售;=sum(c2:c3000);可售;=sum(e2:e3000)>>a2.txt

for /f "tokens=*" %%i in ('findstr /i /c:"可售" bb.txt') do (
    set str=%%i
    set "str=!str:&nbsp;=!"
    set str=!str::=;!

    set str=!str:套=;!
    set str=!str:td id=!
    set str=!str:"saleinfo" align=!
    set str=!str:"center"=!
    set str=!str:/td=!
    set "str=!str:<>=!"
    set "str=!str:<=!"
    set "str=!str:>=;!"
    >>a2.txt echo,!str!
)
`call exit


@echo off
setlocal enabledelayedexpansion
>a3.txt type nul
echo=总售;=sum(b2:b3000);可售;=sum(d2:d3000)>>a3.txt

for /f "tokens=*" %%i in ('findstr /i /c:"可售" bb.txt') do (
    set str=%%i
    set str=!str:~33,-5!
    set "str=!str:&nbsp=!"
    set str=!str::=;!
    set str=!str:套=!

    >>a3.txt echo,!str!
)
`call exit





@echo off
>a4.txt type nul
for /f "tokens=2 delims=>" %%a in ('findstr /i /c:"可售" bb.txt') do  echo=%%a >>b1.txt
for /f "tokens=1 delims=</td" %%b in (b1.txt) do  echo=%%b >>b2.txt
for /f "tokens=1-2 delims=套&nbsp;" %%c in (b2.txt) do  echo=%%c;%%d>>b3.txt
echo=总售;=sum(b2:b3000);可售;=sum(d2:d3000)>>a4.txt
for /f "tokens=1-3 delims=:" %%e in (b3.txt) do  echo=%%e;%%f;%%g>>a4.txt

del b1.txt
del b2.txt
del b3.txt
call exit







call exit
copy build*.pub bb.txt
findstr /i /c:"可售" bb.txt >1.txt






五个方法全贴吧,也给自己留个备份。

TOP

回复 8# pk987


    7楼的不行吗?

TOP

不好意思,我也在看贴,没留意七楼,七楼的方法我试了,可行,非常感谢你的帮忙。

TOP

本帖最后由 guaiwu 于 2012-12-31 23:03 编辑
  1. @echo off
  2. for /f "tokens=2,4  delims=>&;<" %%a in (1.txt) do (
  3. echo %%a %%c
  4. )
  5. pause
  6. )
  7. pause
复制代码
借取三楼的代码的。
莫求昨天无悔,但愿今日无愧。

TOP

返回列表