标题: [文本处理] [已解决]请教批处理如何提取指定格式的字符串? [打印本页]
作者: kinvanhon 时间: 2014-12-14 13:15 标题: [已解决]请教批处理如何提取指定格式的字符串?
本帖最后由 kinvanhon 于 2014-12-17 20:31 编辑
新手莫怪,昨天开始研究了findstr结果不能提取局部字符串,用for也无从下手,希望高手指点。
文本格式如下:- firmware(>=7.0) mobilesubstrate preferenceloader
- firmware(>=8.0) preferenceloader
- mobilesubstrate com.chpwn.iconsupport firmware(>=7.0) preferenceloader
- mobilesubstrate applist(>=1.4) preferenceloader
- mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=4.3)
- mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=6.0)
- firmware(>=3.1) mobilesubstrate libhide gsc.armv7 preferenceloader
- firmware(>=6.0)
- firmware(>=7.0) mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2)
- firmware(>=5.0) firmware(<<8.2) preferenceloader
- mobilesubstrate
复制代码
需要提取的字符串格式是 bbbbbbbb(*) * 代表括号内字符,行中有几个就提取几个,不存在的行就以字母a替换该行内容
要提取的字符串在行中位置不固定,也可能在某些行中不存在,各行中的不同列以空格分隔。
作者: DAIC 时间: 2014-12-14 19:35
- 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 编辑
- firmware(>=7.0) mobilesubstrate preferenceloader
- firmware(>=8.0) preferenceloader
- mobilesubstrate com.chpwn.iconsupport firmware(>=7.0) preferenceloader
- mobilesubstrate applist(>=1.4) preferenceloader
- mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=4.3)
- mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2) firmware(>=6.0)
- firmware(>=3.1) mobilesubstrate libhide gsc.armv7 preferenceloader
- firmware(>=6.0)
- firmware(>=7.0) mobilesubstrate(>=0.9.5000) preferenceloader(>=2.2.2)
- firmware(>=5.0) firmware(<<8.2) preferenceloader
- mobilesubstrate
复制代码
我需要取firmware(>=***)或者firmware(<<***)这样格式的字符串,有的行有,有的行没有,有的行有多个
作者: kinvanhon 时间: 2014-12-15 21:21
就事论事,自己用目前能想到的代码得到了比较接近的结果,但只能取出一个,我还是想能直接全部取出不用转弯,望各高手指点。
代码- @echo off
- if exist b.txt del b.txt
- if exist d.txt del d.txt
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (c.txt) do (
- set "str=%%i"
- if "!str!"=="!str:firmware=!" (echo a>>b.txt) else echo !str:*firmware(^>=!>>b.txt
- )
- for /f "delims==)" %%i in (b.txt) do (
- set "str1=ios"
- set "str2=%%i"
- set "str3=以上"
- set "str4=a"
- if "!str2!"=="!str4!" (echo a>>d.txt) else echo !str1! !str2!!str3!>>d.txt
- )
- pause
复制代码
结果- ios 7.0以上
- ios 8.0以上
- ios 7.0以上
- a
- ios 4.3以上
- ios 6.0以上
- ios 3.1以上
- ios 6.0以上
- ios 7.0以上
- ios 5.0以上
- a
复制代码
作者: DAIC 时间: 2014-12-15 23:44
- 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
- @echo off
- setlocal enabledelayedexpansion
- set "s=firmware("
- set Lf=^
-
-
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"
- if "!str:%s%=!" NEQ "!str!" (
- for %%b in ("!Lf!") do echo,!str: %s%=%%~b%s%!>$
- for /f "delims=)" %%b in ('findstr /ib "%s%" $') do (
- set /p"=%%b) " <nul
- )
- echo,
- ) else echo,NO
- )
- pause
复制代码
作者: kinvanhon 时间: 2014-12-17 19:55
回复 10# apang
谢谢帮助
作者: yiwuyun 时间: 2014-12-18 12:11
- @echo off
- echo {>yiwuyun.txt
- echo sub1=$0>>yiwuyun.txt
- echo where=match($0,/(firmware\([^^()]*\))/,arr)>>yiwuyun.txt
- echo if (where!=0){>>yiwuyun.txt
- echo while(where!=0){>>yiwuyun.txt
- echo print arr[1]>>yiwuyun.txt
- echo sub1=gensub(/(firmware\([^^()]*\))/,"",1,sub1)>>yiwuyun.txt
- echo where=match(sub1,/(firmware\([^^()]*\))/,arr)>>yiwuyun.txt
- echo }>>yiwuyun.txt
- echo }else{print "no"}>>yiwuyun.txt
- echo }>>yiwuyun.txt
- gawk -f yiwuyun.txt a.txt
- if exist yiwuyun.txt del yiwuyun.txt
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |