中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结][求助] - 文本中提取指定的内容(位置会变动的)
« [1] [2] »
作者:
标题: [已结][求助] - 文本中提取指定的内容(位置会变动的) 上一主题 | 下一主题
h2o
初级用户





积分 44
发帖 18
注册 2006-10-9
状态 离线
『楼 主』:  [已结][求助] - 文本中提取指定的内容(位置会变动的)

input.txt
--------------
<input name=id value=1842 type=hidden>
--------------

我想要得到 value 后面的那个值 1842
用的代码是:
FOR /F "tokens=3" %%a IN (input.txt) do (
echo id=%%a
)

可是 后来测试几个 发现 input.txt 中的内容是会这样变化的:( input.txt 这个文件也是 find 一个网页生成的 )
<input type=hidden name=id value=1842>

原来的代码 就不成了 盼望朋友们指点迷津
谢谢你们了
====================================
回复 2 楼 namejm 朋友,
先谢谢 namejm 朋友的热心帮助 谢谢你
我刚测试了下代码

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-3* delims==" %%i IN (input.txt) do (
    set var1=%%i
    set var2=%%j
    set var3=%%k
    set var4=%%l
    echo !var1:~1,1!|findstr /r "[0-9]">nul && echo !var1:~0,4!
    echo !var2:~1,1!|findstr /r "[0-9]">nul && echo !var2:~0,4!
    echo !var3:~1,1!|findstr /r "[0-9]">nul && echo !var3:~0,4!
    echo !var4:~1,1!|findstr /r "[0-9]">nul && echo !var4:~0,4!
)
pause

这个真的可以提取到数字 不过 那个 value 的值长好象是不固定的 会有蛮大数字出现的情况

第二个代码 我用下面这个内容测试
<input type=hidden name=id value=465974855>
输出这样:
value=465974855~0,1intercept " ~1 "

ps:呵呵 这个代码我的机子运行起来有点久 -_-||


我的系统是 sp2
我之前1楼的问题描述有点模糊 提供的信息不够多 我补充点点 ^-^
我测试了几个 input.txt ( 单行的文本 )
目前为止 发现内容是类似这样的:

情况 a:
<input type=hidden name=id value=465974855>
<input type=hidden name=id value=1820988170>
<input type=hidden name=id value=1008964101>

情况 b:
<input name=id value=465974855 type=hidden>
<input name=id value=1820988170 type=hidden>

value 的值的位数好象是变化的
还有一个,似乎只有两种不同的情况,就是 type=hidden 的这个在的位置不同,像这样的情况,可不可以判断 type=hidden 在的位置 然后分情况用这个来处理呢?

情况 a:
FOR /F "tokens=4" %%a IN (input.txt) do (
echo id=%%a
)

情况 b:
FOR /F "tokens=3" %%a IN (input.txt) do (
echo id=%%a
)

呵呵 大家别笑 我想到的法子都是比较那个的

=========结束语=======================

在论坛朋友们的热心帮助下 又解决了一问题
点拨大恩无以回报 唯有……
谢谢

[ Last edited by h2o on 2006-10-17 at 01:55 ]

2006-10-16 12:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  假设一条记录中只有一个数字,并且数字是4位的,那么,用下面的代码可以简单地实现提取数字:
@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-3* delims==" %%i IN (input.txt) do (
    set var1=%%i
    set var2=%%j
    set var3=%%k
    set var4=%%l
    echo !var1:~1,1!|findstr /r "[0-9]">nul && echo !var1:~0,4!
    echo !var2:~1,1!|findstr /r "[0-9]">nul && echo !var2:~0,4!
    echo !var3:~1,1!|findstr /r "[0-9]">nul && echo !var3:~0,4!
    echo !var4:~1,1!|findstr /r "[0-9]">nul && echo !var4:~0,4!
)
pause
  另外,还可以通过探测每一个字符的类型来获得数字,此时数字位数可以不受限制,不过效率十分低下:
@echo off
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in (input.txt) do   call :intercept "%%i"
echo value=%str_%
pause
goto :eof

:intercept
set str=%1
set str=%str:~2,-2%
if not "%str%"=="" echo. "%str:~0,1%"|findstr "[0-9]">nul && (
    set num=1&set str_=!str_!%str:~0,1%&&call :intercept " !str:~1! ")||(
    if %num% equ 0 call :intercept " !str:~1! "
)
goto :eof
[ Last edited by namejm on 2006-10-17 at 00:45 ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-16 14:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
h2o
初级用户





积分 44
发帖 18
注册 2006-10-9
状态 离线
『第 3 楼』:  

谢谢 namejm 版主的热心帮助 谢谢你
1 楼我原来提供的信息不多 现在作了补充了
请朋友们帮忙分析一下 ^-^

2006-10-16 16:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 4 楼』:  

楼主的文本的内容不是很清楚, 请测试...
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims== " %%i in ('findstr /i /c:"value" input.txt') do (
    if not "%%m"=="id" echo %%m
    if not "%%o"=="hidden>"  set ii=%%o & echo !ii:~0,-2!
)
pause


2006-10-16 21:30
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 5 楼』:  

我也补充一个,不依赖字符前后关系,会获取 value= 后的任意值。

  Quote:

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. FOR /f "delims=" %%i in (input.txt) do (
  4. set "t=%%i"
  5. set "t=!t:<=!"
  6. set "t=!t:>=!"
  7. set "t=!t:&=!"
  8. set "t=!t:|=!"
  9. call :sub !t!
  10. )
  11. goto :EOF

  12. :sub
  13. if "%1" == "" exit /b
  14. if "%F%" == "1" echo %1 &set F=0
  15. if "%1" == "value" set F=1
  16. shift
  17. goto sub
        无奈何发表于    2006-10-16  09:48

但是批处理在处理较大文本时效率低下,GREP 处理你的这个问题非常简单,你可以不用 find 过滤内容,而直接用 grep 提取。
grep -io -P "(?<=value=)(\d+)" input.txt
Grep 下载地址:http://unxutils.sourceforge.net/UnxUpdates.zip



  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-10-16 22:22
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  无奈何第5楼的代码十分高效,充分利用了shift来对参数进行改位操作,去掉敏感字符的方法也比较巧妙,以后获取指定位置的字符串可以套用这个模式。建议大家人手一份,妥善收藏^_^。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-17 00:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  回顶楼:

  Quote:
第二个代码 我用下面这个内容测试
<input type=hidden name=id value=465974855>
输出这样:
value=465974855~0,1intercept " ~1 "

  因为我少了一个判断字符串是否结束的条件,所以会造成显示错误,现在已经修正,请重新测试2F的代码。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-17 00:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





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

无奈何斑竹的代码我还是看不懂,复制下来回去研究
shift

这个是什么意思?后面什么也没有?不解

[ Last edited by he200377 on 2006-10-17 at 02:04 ]

2006-10-17 00:53
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
h2o
初级用户





积分 44
发帖 18
注册 2006-10-9
状态 离线
『第 9 楼』:  

to pengfei  朋友,
谢谢你,你提供的代码测试ok,
-----------------------------------
to 无奈何 朋友,
谢谢你,你提供的代码 和 工具都测试ok,
-----------------------------------
to namejm 朋友,
谢谢你,更新过的代码2 测试已经ok了,
-----------------------------------



呵呵 惭愧 惭愧 我技术实在不行,复杂点的 暂时 还没分析明白,这个大致看明白了:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1-7 delims== " %%i in ('findstr /i /c:"value" input.txt') do (
    if not "%%m"=="id" echo %%m
    if not "%%o"=="hidden>"  set ii=%%o & echo !ii:~0,-2!
)
pause
哈哈哈…… 我得找找 setlocal 的用法来学习下先

谢谢 谢谢楼上所有的大家
谢谢 namejm, pengfei, 无奈何 几位热心朋友
谢谢 大家费心了 送一个歌曲大家 聊表心意 ^-^




献上一曲

2006-10-17 01:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
9527
银牌会员

努力做坏人


积分 1185
发帖 438
注册 2006-8-28
来自 北京
状态 离线
『第 10 楼』:  

我也顺便来一个,大体跟无奈何的一致,不过有些细节不太一样

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
set "a=%%a"
set "a=!a:>= !"
set "a=!a:*value=!"
call :ok !a!
)
goto :eof
:ok
for /f "delims== " %%x in ("%1") do echo %%x
goto :eof



我今后在论坛的目标就是做个超级坏人!!!
2006-10-17 02:59
查看资料  发短消息 网志  OICQ (329429)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 11 楼』:  

顶一个~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-10-17 03:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 12 楼』:  


  我也顶一个~

  刚开始以为这个问题很难下手,但是看了几个高手的代码之后,深感敬佩之意,受教中…………


2006-10-17 03:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 13 楼』:  



  Quote:
Originally posted by pip at 2006-10-17 02:59:
我也顺便来一个,大体跟无奈何的一致,不过有些细节不太一样

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
set "a=%%a&q ...

pip兄的代码非常精彩~:)

pip兄call的代码内可以不要过滤=号的部分,
%1...%9接收参数的时候会自动滤掉“,”逗号和空格还有自动滤掉等号~:)
帮PIP兄代码中去掉了一部份:)

帮pip的代码去掉了call内过滤=号的部分:)
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
        set "a=%%a"
        set "a=!a:>= !"
        set "a=!a:*value=!"
        call :ok !a!
)
goto :eof

:ok
echo %1  &&  goto :Eof




    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-10-17 03:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 14 楼』:  

pip兄的思路很独特, 把value前面的所有字符去掉, 这样需要得到的字符就会出现在最前面, 在提取时省了不少麻烦.

但也有一个缺陷, 当没有value行时数据无效, 所以得先用findstr过滤掉不需要的行.
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('findstr /i /c:"value" input.txt') do (
        set "a=%%a"
        set "a=!a:>= !"
        set "a=!a:*value=!"
        call :ok !a!
)
pause
goto :eof

:ok
echo %1
goto :Eof


2006-10-17 04:07
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 15 楼』:  

越来越精彩了~:)
接着顶~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-10-17 04:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: