Board logo

标题: [文本处理] 批处理如何获得指定字符前后的字符? [打印本页]

作者: cjiabing    时间: 2011-5-28 02:04     标题: 批处理如何获得指定字符前后的字符?

假如有一文本:
  1. 科波拉黑帮经典《教父》的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属
  2. 众望所归。虽然评论界一致对《教父》系列的第2集推崇有佳,但大多数影迷似乎还是对
  3. 《教父》情有独钟,这可能与马龙·白兰度极具个人魅力的表演有关,直到今天他那种含
  4. 糊沙哑的声音与神秘莫测的表情都依然叫人着迷。
复制代码
1、我想提取指定字符“教父”前后的字符,也就是想知道“教父”前后是什么字,如何提取?
2、换个角度,假如我想提取“《”和“》”之间的字符,又怎么提取?

第二个问题似乎较为简单,第一个有点难度。
代码不投机取巧,要求实用和效率。
批处理支持的任何方法都可以,包括第三方。
作者: Batcher    时间: 2011-5-28 02:14

1:
  1. grep -o "..教父.." 1.txt | sed "s/教父//" | more >2.txt
复制代码
2:
  1. 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 编辑

第一问:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do set "str=!str!%%a"
  3. :lp
  4. set "a="&set "b="
  5. for /f "tokens=1* delims=教父" %%a in ("!str!") do (
  6.     set "a=%%a"&set "a=!a:~-1!"
  7.     if "%%b" neq "" set "b=%%b"&set "b=!b:~,1!"
  8.     set "var=!var!!a!!b!"
  9.     if "%%b" neq "" set "str=%%b"&goto lp
  10. )
  11. echo !var:~,-1!
  12. pause>nul
复制代码
  1. Dim fso, vbstr
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
  4. Set RegEx = New RegExp
  5. regex.Global = True
  6. regex.Pattern = ".*(.)教父(.).*|\s|[^$]"
  7. vbstr = regex.Replace(vbstr, "$1$2")
  8. MsgBox vbstr
  9. Set regex = Nothing
  10. Set fso = Nothing
复制代码

作者: batman    时间: 2011-5-28 10:39

本帖最后由 batman 于 2011-5-28 11:07 编辑

第二问:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do set "str=!str!%%a"
  3. :lp
  4. set "str=%str:*《=%"&set "a=!str:*》=!"
  5. set "var=!var!!str:》%a%=!"&set "str=%str:*》=%"
  6. for /f "delims=《》" %%a in ("%str%") do if "%%a" neq "%str%" goto lp
  7. echo %var%
  8. pause>nul
复制代码
  1. Dim fso, vbstr, rgstr, re
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. vbstr = fso.OpenTextFile("a.txt", 1).ReadAll()
  4. Set RegEx = New RegExp
  5. regex.Global = True
  6. regex.Pattern = "《([^《》]+)》"
  7. For Each rgstr In regex.Execute(vbstr)
  8.   re = re & rgstr.Submatches(0)
  9. Next
  10. MsgBox re
  11. Set regex = Nothing
  12. Set fso = Nothing
复制代码
ps:以上四个代码均兼容要取的字符分在两行的情况。。。
作者: 随风    时间: 2011-5-28 11:10

:如果每行最多只有一个“教父”
:
  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do (
  3.    set str=%%i
  4.    setlocal enabledelayedexpansion
  5.    set var=!str:*教父=!
  6.    if not "!var!"=="!str!" (
  7.       for %%j in ("!var!") do set num=!str:%%~j=!
  8.       if "!num:~2,1!"=="" set num=!var!!num!
  9.       echo 左!num:~-3,1!    !var:~0,1!右
  10.     )
  11.    endlocal
  12. )
  13. pause
复制代码

作者: CrLf    时间: 2011-5-28 11:55

本帖最后由 zm900612 于 2011-5-28 15:58 编辑

一个思路:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123《abc》456《def》789
  3. for /l %%a in (1 1 10) do (
  4.    set str=!str:*《=!
  5.    for /f "tokens=1* delims=》" %%b in ("!str!《") do (
  6.       if "%%c" neq "" echo %%b
  7.       set str=%%c
  8.    )
  9. )
  10. pause
复制代码
修改一下
作者: cjiabing    时间: 2011-5-28 13:41

很好,谢谢各位,等我测试了再告诉你们结果!~
作者: abcdshenji    时间: 2011-5-28 23:59

本帖最后由 abcdshenji 于 2011-5-29 00:00 编辑

我也来一个,能力有限,没什么技术含量只为完成任务,不能跟各位版主比。。。

每行只有一个“《教父》”:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('type "1.txt"^|findstr "《教父》"') do (
  3. set "v=%%i"&set "v=!v:《教父》=@!"
  4. if "!v:~,1!"=="@" (echo !v:~1,1! ) else (
  5. if "!v:~-1!"=="@" (echo  !v:~-2,1!) else (
  6. for /f "tokens=1,2 delims=@" %%j in ("!v!") do (
  7. set "v1=%%j"&set "v2=%%k"
  8. echo !v1:~-1! !v2:~,1!
  9. )
  10. )
  11. )
  12. )
  13. pause>nul
复制代码





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