标题: [文本处理] 批处理如何获得指定字符前后的字符? [打印本页]
作者: cjiabing 时间: 2011-5-28 02:04 标题: 批处理如何获得指定字符前后的字符?
假如有一文本:- 科波拉黑帮经典《教父》的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属
- 众望所归。虽然评论界一致对《教父》系列的第2集推崇有佳,但大多数影迷似乎还是对
- 《教父》情有独钟,这可能与马龙·白兰度极具个人魅力的表演有关,直到今天他那种含
- 糊沙哑的声音与神秘莫测的表情都依然叫人着迷。
复制代码
1、我想提取指定字符“教父”前后的字符,也就是想知道“教父”前后是什么字,如何提取?
2、换个角度,假如我想提取“《”和“》”之间的字符,又怎么提取?
第二个问题似乎较为简单,第一个有点难度。
代码不投机取巧,要求实用和效率。
批处理支持的任何方法都可以,包括第三方。
作者: Batcher 时间: 2011-5-28 02:14
1:- grep -o "..教父.." 1.txt | sed "s/教父//" | more >2.txt
复制代码
2:- grep -o "《.*》" 1.txt | sed "s/《\|》//g" | more >2.txt
复制代码
http://bbs.bathome.net/thread-1114-1-1.html
作者: batman 时间: 2011-5-28 10:26
本帖最后由 batman 于 2011-5-28 10:51 编辑
第一问:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do set "str=!str!%%a"
- :lp
- set "a="&set "b="
- for /f "tokens=1* delims=教父" %%a in ("!str!") do (
- set "a=%%a"&set "a=!a:~-1!"
- if "%%b" neq "" set "b=%%b"&set "b=!b:~,1!"
- set "var=!var!!a!!b!"
- if "%%b" neq "" set "str=%%b"&goto lp
- )
- echo !var:~,-1!
- pause>nul
复制代码
- Dim fso, vbstr
- Set fso = CreateObject("scripting.filesystemobject")
- vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
- Set RegEx = New RegExp
- regex.Global = True
- regex.Pattern = ".*(.)教父(.).*|\s|[^$]"
- vbstr = regex.Replace(vbstr, "$1$2")
- MsgBox vbstr
- Set regex = Nothing
- Set fso = Nothing
复制代码
作者: batman 时间: 2011-5-28 10:39
本帖最后由 batman 于 2011-5-28 11:07 编辑
第二问:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do set "str=!str!%%a"
- :lp
- set "str=%str:*《=%"&set "a=!str:*》=!"
- set "var=!var!!str:》%a%=!"&set "str=%str:*》=%"
- for /f "delims=《》" %%a in ("%str%") do if "%%a" neq "%str%" goto lp
- echo %var%
- pause>nul
复制代码
- Dim fso, vbstr, rgstr, re
- Set fso = CreateObject("scripting.filesystemobject")
- vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
- Set RegEx = New RegExp
- regex.Global = True
- regex.Pattern = "《([^《》]+)》"
- For Each rgstr In regex.Execute(vbstr)
- re = re & rgstr.Submatches(0)
- Next
- MsgBox re
- Set regex = Nothing
- Set fso = Nothing
复制代码
ps:以上四个代码均兼容要取的字符分在两行的情况。。。
作者: 随风 时间: 2011-5-28 11:10
:如果每行最多只有一个“教父”
:- @echo off
- for /f "delims=" %%i in (a.txt) do (
- set str=%%i
- setlocal enabledelayedexpansion
- set var=!str:*教父=!
- if not "!var!"=="!str!" (
- for %%j in ("!var!") do set num=!str:%%~j=!
- if "!num:~2,1!"=="" set num=!var!!num!
- echo 左!num:~-3,1! !var:~0,1!右
- )
- endlocal
- )
- pause
复制代码
作者: CrLf 时间: 2011-5-28 11:55
本帖最后由 zm900612 于 2011-5-28 15:58 编辑
一个思路:- @echo off&setlocal enabledelayedexpansion
- set str=123《abc》456《def》789
- for /l %%a in (1 1 10) do (
- set str=!str:*《=!
- for /f "tokens=1* delims=》" %%b in ("!str!《") do (
- if "%%c" neq "" echo %%b
- set str=%%c
- )
- )
- pause
复制代码
修改一下
作者: cjiabing 时间: 2011-5-28 13:41
很好,谢谢各位,等我测试了再告诉你们结果!~
作者: abcdshenji 时间: 2011-5-28 23:59
本帖最后由 abcdshenji 于 2011-5-29 00:00 编辑
我也来一个,能力有限,没什么技术含量只为完成任务,不能跟各位版主比。。。
每行只有一个“《教父》”:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('type "1.txt"^|findstr "《教父》"') do (
- set "v=%%i"&set "v=!v:《教父》=@!"
- if "!v:~,1!"=="@" (echo !v:~1,1! ) else (
- if "!v:~-1!"=="@" (echo !v:~-2,1!) else (
- for /f "tokens=1,2 delims=@" %%j in ("!v!") do (
- set "v1=%%j"&set "v2=%%k"
- echo !v1:~-1! !v2:~,1!
- )
- )
- )
- )
- pause>nul
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |