Board logo

标题: [文本处理] [已解决]请教批处理如何提取指定格式的字符串? [打印本页]

作者: kinvanhon    时间: 2014-12-14 13:15     标题: [已解决]请教批处理如何提取指定格式的字符串?

本帖最后由 kinvanhon 于 2014-12-17 20:31 编辑

新手莫怪,昨天开始研究了findstr结果不能提取局部字符串,用for也无从下手,希望高手指点。
文本格式如下:
  1. firmware(>=7.0) mobilesubstrate preferenceloader
  2. firmware(>=8.0) preferenceloader
  3. mobilesubstrate com.chpwn.iconsupport firmware(>=7.0) preferenceloader
  4. mobilesubstrate applist(>=1.4) preferenceloader
  5. mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=4.3)
  6. mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=6.0)
  7. firmware(>=3.1) mobilesubstrate libhide gsc.armv7 preferenceloader
  8. firmware(>=6.0)
  9. firmware(>=7.0) mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2)
  10. firmware(>=5.0) firmware(<<8.2) preferenceloader
  11. mobilesubstrate
复制代码
需要提取的字符串格式是 bbbbbbbb(*)   * 代表括号内字符,行中有几个就提取几个,不存在的行就以字母a替换该行内容
要提取的字符串在行中位置不固定,也可能在某些行中不存在,各行中的不同列以空格分隔。
作者: DAIC    时间: 2014-12-14 19:35

  1. sed "s/.*\(bbbbbbbb([^)]\+)\).*/\1/" a.txt > b.txt
复制代码

作者: kinvanhon    时间: 2014-12-14 20:12

回复 2# DAIC


    能不能用批处理命令
作者: kinvanhon    时间: 2014-12-15 15:44

DAIC 发表于 2014-12-14 19:35


如果一行中有重复的匹配字串就只能取第一个了,是后面\1参数的问题吧,我自己改没成功
作者: DAIC    时间: 2014-12-15 15:54

回复 4# kinvanhon


    把你的测试数据发出来,我试试。
作者: kinvanhon    时间: 2014-12-15 16:00

本帖最后由 kinvanhon 于 2014-12-15 18:27 编辑
  1. firmware(>=7.0) mobilesubstrate preferenceloader
  2. firmware(>=8.0) preferenceloader
  3. mobilesubstrate com.chpwn.iconsupport firmware(>=7.0) preferenceloader
  4. mobilesubstrate applist(>=1.4) preferenceloader
  5. mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=4.3)
  6. mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=6.0)
  7. firmware(>=3.1) mobilesubstrate libhide gsc.armv7 preferenceloader
  8. firmware(>=6.0)
  9. firmware(>=7.0) mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2)
  10. firmware(>=5.0) firmware(<<8.2) preferenceloader
  11. mobilesubstrate
复制代码
我需要取firmware(>=***)或者firmware(<<***)这样格式的字符串,有的行有,有的行没有,有的行有多个
作者: kinvanhon    时间: 2014-12-15 21:21

就事论事,自己用目前能想到的代码得到了比较接近的结果,但只能取出一个,我还是想能直接全部取出不用转弯,望各高手指点。
代码
  1. @echo off
  2. if exist b.txt del b.txt
  3. if exist d.txt del d.txt
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in (c.txt) do (
  6. set "str=%%i"
  7. if "!str!"=="!str:firmware=!" (echo a>>b.txt) else echo !str:*firmware(^>=!>>b.txt
  8. )
  9. for /f "delims==)" %%i in (b.txt) do (
  10. set "str1=ios"
  11. set "str2=%%i"
  12. set "str3=以上"
  13. set "str4=a"
  14. if "!str2!"=="!str4!" (echo a>>d.txt) else echo !str1! !str2!!str3!>>d.txt
  15. )
  16. pause
复制代码
结果
  1. ios 7.0以上
  2. ios 8.0以上
  3. ios 7.0以上
  4. a
  5. ios 4.3以上
  6. ios 6.0以上
  7. ios 3.1以上
  8. ios 6.0以上
  9. ios 7.0以上
  10. ios 5.0以上
  11. a
复制代码

作者: DAIC    时间: 2014-12-15 23:44

  1. sed "s/ /\n/g" a.txt | sed "/firmware/!d; s/.*\(bbbbbbbb([^)]\+)\).*/\1/" > b.txt
复制代码

作者: kinvanhon    时间: 2014-12-16 07:51

回复 8# DAIC


    感谢再次相助,可能是我没表达清楚,我想把每一行所有的 firmware(****) 这个格式的字符串都取出来  ,没有的这个格式字符串的行用一个字母或者符号表示
作者: apang    时间: 2014-12-16 16:43

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "s=firmware("
  4. set Lf=^
  5. for /f "delims=" %%a in (a.txt) do (
  6.         set "str=%%a"
  7.         if "!str:%s%=!" NEQ "!str!" (
  8.                 for %%b in ("!Lf!") do echo,!str: %s%=%%~b%s%!>$
  9.                 for /f "delims=)" %%b in ('findstr /ib "%s%" $') do (
  10.                         set /p"=%%b) " <nul
  11.                 )
  12.                 echo,
  13.         ) else echo,NO
  14. )
  15. pause
复制代码

作者: kinvanhon    时间: 2014-12-17 19:55

回复 10# apang


    谢谢帮助
作者: yiwuyun    时间: 2014-12-18 12:11

  1. @echo off
  2. echo {>yiwuyun.txt
  3. echo sub1=$0>>yiwuyun.txt
  4. echo where=match($0,/(firmware\([^^()]*\))/,arr)>>yiwuyun.txt
  5. echo if (where!=0){>>yiwuyun.txt
  6. echo while(where!=0){>>yiwuyun.txt
  7. echo print arr[1]>>yiwuyun.txt
  8. echo sub1=gensub(/(firmware\([^^()]*\))/,"",1,sub1)>>yiwuyun.txt
  9. echo where=match(sub1,/(firmware\([^^()]*\))/,arr)>>yiwuyun.txt
  10. echo }>>yiwuyun.txt
  11. echo }else{print "no"}>>yiwuyun.txt
  12. echo }>>yiwuyun.txt
  13. gawk -f yiwuyun.txt a.txt
  14. if exist yiwuyun.txt del yiwuyun.txt
  15. pause
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2