| 
 
h2o 
初级用户
 
  
 
  
  
积分 44 
发帖 18 
注册 2006-10-9 
状态 离线
 | 
『楼 主』:
 [已结][求助] - 文本中提取指定的内容(位置会变动的)
 
使用 LLM 解释/回答一下
  
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> 
 
原来的代码 就不成了 盼望朋友们指点迷津 <img src="images/smilies/face-sad.png" align="absmiddle" border="0">  
谢谢你们了 
==================================== 
回复 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 "">nul && echo !var1:~0,4! 
    echo !var2:~1,1!|findstr /r "">nul && echo !var2:~0,4! 
    echo !var3:~1,1!|findstr /r "">nul && echo !var3:~0,4! 
    echo !var4:~1,1!|findstr /r "">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 
) 
 
呵呵 大家别笑 我想到的法子都是比较那个的 
 
=========结束语======================= 
 
在论坛朋友们的热心帮助下 又解决了一问题  
点拨大恩无以回报 唯有…… 
谢谢 <img src="images/smilies/face-smile-big.png" align="absmiddle" border="0"> 
 
 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 楼』:
 
 
使用 LLM 解释/回答一下
  
  假设一条记录中只有一个数字,并且数字是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 "">nul && echo !var1:~0,4! 
    echo !var2:~1,1!|findstr /r "">nul && echo !var2:~0,4! 
    echo !var3:~1,1!|findstr /r "">nul && echo !var3:~0,4! 
    echo !var4:~1,1!|findstr /r "">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 "">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 楼』:
 
 
使用 LLM 解释/回答一下
  
谢谢 namejm 版主的热心帮助 谢谢你 
1 楼我原来提供的信息不多 现在作了补充了  
请朋友们帮忙分析一下 ^-^ 
 
    
 
  
 |   
 | 
  2006-10-16 16:39 | 
  
 | 
 | 
 
pengfei 
银牌会员
 
     
 
  
 
积分 1218 
发帖 485 
注册 2006-7-21 来自 湖南.娄底 
状态 离线
 | 
『第 4 楼』:
 
 
使用 LLM 解释/回答一下
  
楼主的文本的内容不是很清楚, 请测试... 
 
@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 | 
  
 | 
 | 
 
无奈何 
荣誉版主
 
       
 
  
  
积分 1338 
发帖 356 
注册 2005-7-15 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
我也补充一个,不依赖字符前后关系,会获取 value= 后的任意值。 
 
 
- @echo off
 
 - setlocal enabledelayedexpansion
 
 - FOR /f "delims=" %%i in (input.txt) do (
 
 - set "t=%%i"
 
 - set "t=!t:<=!"
 
 - set "t=!t:>=!"
 
 - set "t=!t:&=!"
 
 - set "t=!t:|=!"
 
 - call :sub !t!
 
 - )
 
 - goto :EOF
 
  
- :sub
 
 - if "%1" == "" exit /b
 
 - if "%F%" == "1" echo %1 &set F=0
 
 - if "%1" == "value" set F=1
 
 - shift
 
 - 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 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 6 楼』:
 
 
使用 LLM 解释/回答一下
  
  无奈何第5楼的代码十分高效,充分利用了shift来对参数进行改位操作,去掉敏感字符的方法也比较巧妙,以后获取指定位置的字符串可以套用这个模式。建议大家人手一份,妥善收藏^_^。 
 
    
 
  
  |  
                  
  
                    尺有所短,寸有所长,学好CMD没商量。 
考虑问题复杂化,解决问题简洁化。 |   
 | 
  2006-10-17 00:37 | 
  
 | 
 | 
 
namejm 
荣誉版主
 
        batch fan
  
 
积分 5226 
发帖 1737 
注册 2006-3-10 来自 成都 
状态 离线
 | 
『第 7 楼』:
 
 
使用 LLM 解释/回答一下
  
  回顶楼: 第二个代码 我用下面这个内容测试 
<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 楼』:
 
 
使用 LLM 解释/回答一下
  
无奈何斑竹的代码我还是看不懂,复制下来回去研究 
shift  
 
这个是什么意思?后面什么也没有?不解 
 
 Last edited by he200377 on 2006-10-17 at 02:04 ] 
 
    
 
  
 |   
 | 
  2006-10-17 00:53 | 
  
 | 
 | 
 
h2o 
初级用户
 
  
 
  
  
积分 44 
发帖 18 
注册 2006-10-9 
状态 离线
 | 
『第 9 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
我也顺便来一个,大体跟无奈何的一致,不过有些细节不太一样 
 
@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 | 
  
 | 
 | 
 
redtek 
金牌会员
 
      
 
  
  
积分 2902 
发帖 1147 
注册 2006-9-21 
状态 离线
 | 
『第 11 楼』:
 
 
使用 LLM 解释/回答一下
  
顶一个~:) 
 
    
 
  
  |  
                  
  
                        Redtek,一个永远在网上流浪的人…… 
 
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |   
 | 
  2006-10-17 03:26 | 
  
 | 
 | 
 
lxmxn 
版主
 
        
 
  
 
积分 11386 
发帖 4938 
注册 2006-7-23 
状态 离线
 | 
『第 12 楼』:
 
 
使用 LLM 解释/回答一下
  
 
  我也顶一个~ 
 
  刚开始以为这个问题很难下手,但是看了几个高手的代码之后,深感敬佩之意,受教中………… 
 
    
 
  
 |   
 | 
  2006-10-17 03:35 | 
  
 | 
 | 
 
redtek 
金牌会员
 
      
 
  
  
积分 2902 
发帖 1147 
注册 2006-9-21 
状态 离线
 | 
『第 13 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 | 
  
 | 
 | 
 
redtek 
金牌会员
 
      
 
  
  
积分 2902 
发帖 1147 
注册 2006-9-21 
状态 离线
 | 
『第 15 楼』:
 
 
使用 LLM 解释/回答一下
  
越来越精彩了~:) 
接着顶~:) 
 
    
 
  
  |  
                  
  
                        Redtek,一个永远在网上流浪的人…… 
 
_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._ |   
 | 
  2006-10-17 04:18 | 
  
 |