[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何获得指定字符前后的字符?

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

第二个问题似乎较为简单,第一个有点难度。
代码不投机取巧,要求实用和效率。
批处理支持的任何方法都可以,包括第三方。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

本帖最后由 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
复制代码

TOP

很好,谢谢各位,等我测试了再告诉你们结果!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

本帖最后由 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
复制代码
修改一下

TOP

:如果每行最多只有一个“教父”
:
  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
复制代码
技术问题请到论坛发帖求助!

TOP

本帖最后由 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:以上四个代码均兼容要取的字符分在两行的情况。。。
***共同提高***

TOP

本帖最后由 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
复制代码
***共同提高***

TOP

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
1

评分人数

    • plp626: 喜欢这样简洁的。技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表