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

[文本处理] [已解决]批处理如何提取指定内容所属的文本区域(范围)?

BAT如何获取指定行所在的文本区域
比如test.txt文本内容
安卓手机低配一:
{
     oppo:电池2000毫安
     oppo:充电一分钟通话一小时
     oppo:内存16G
    ……
}
功能机配置:不做配置描述
    诺基亚:1050
安卓手机标配一:
{
    华为:电池3000毫安
     华为:1600万像素
     华为:6英寸
    ……
}
安卓手机低配二:
{
    类似上面格式
    ……
}
安卓手机高配二:
{
    类似上面格式,每个配置项都是唯一的
    ……
}
……文本里还有很多低配置/高配置/标配置,类似上面配置格式



如何获取某一配置行,如“华为:1600万像素 ”所在的配置区域??即经BAT过滤后,得到如下结果:
安卓手机标配一:
{
    华为:电池3000毫安
     华为:1600万像素
     华为:6英寸
    ……
}
1

评分人数

本帖最后由 bailong360 于 2016-3-20 20:48 编辑
  1. //&@cls&more test.txt|cscript -nologo -e:jscript "%~f0"&pause
  2. WSH.Echo(WSH.StdIn.ReadAll().match(/{[^{}]+?华为:1600万像素[^{}]+?}/g))
复制代码
=====2016-3-20 17:35==============
你们都来纯批处理,那我也来一个.应该是最短了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set keyword=华为:1600万像素
  4. set LF=^
  5. for /f "delims=" %%i in ('findstr /rc:"^[ {}]" test.txt') do (
  6.     set "str=!str!!LF!%%i"
  7.     if "%%i"=="}" (
  8.         if "!str:%keyword%=!" neq "!str!" echo {!str:*{=!
  9.         set str=
  10.     )
  11. )
  12. pause
复制代码
2

评分人数

    • enoone1: 字符拼接+10086技术 + 1
    • WHY: {上面少一行技术 + 1

TOP

本帖最后由 pcl_test 于 2016-3-20 18:23 编辑
  1. mshta http://bathome.net/s/hta/ "type('test.txt').match(/[^\r\n]+:\r?\n\{[^\}]+?华为:1600万像素[^\}]+?\}/g)"
复制代码
1

评分人数

TOP

本帖最后由 happy886rr 于 2016-3-20 23:24 编辑

回复 1# enoone1
gk开关
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p str=请输关键词: &echo,
  3. for /f "tokens=1* delims=:" %%A in ('type test.txt^|findstr /n /i /c:"!str!"') do (
  4. set gk=1
  5. for /f "tokens=1* delims=:" %%a in ('type test.txt^|findstr /n "{"') do (
  6. if !gk! equ 1 (
  7. if %%a gtr %%A (
  8. set gk=0
  9. ) else (
  10. set /a mark=%%a-1
  11. )
  12. )
  13. )
  14. if not defined #!mark! (
  15. set "#!mark!=1" &set gk=0
  16. for /f "tokens=1* delims=:" %%a in ('type test.txt^|findstr /n .*') do (
  17. if %%a equ !mark! (set gk=1)
  18. if !gk! equ 1 (echo,%%b &set "dis=%%b"
  19. if "!dis: =!"=="}" (
  20. set gk=0
  21. )
  22. )
  23. )
  24. )
  25. )
  26. pause>nul
复制代码
标记算法
  1. ...
  2. for /f "tokens=1* delims=:" %%a in ('type test.txt^|findstr /n /i /c:"!str!"') do (set #%%a=1)
  3. for /f "tokens=1* delims=:" %%a in ('type test.txt^|findstr /n .*') do (
  4. if "%%b"=="{" (set /a N=%%a-1)
  5. if defined #%%a (set "#%%a=" &set "#!N!=1")
  6. for /f "tokens=1* delims=:" %%a in ('type test.txt^|findstr /n .*') do (
  7. if defined #%%a (set gk=1)
  8. ...
复制代码
2

评分人数

TOP

本帖最后由 WHY 于 2016-3-20 17:49 编辑

临时文件方案
  1. @echo off & setlocal enabledelayedexpansion
  2. set "keyWord=华为:1600万像素"
  3. set n=0
  4. for /f "delims=" %%i in (test.txt) do (
  5.     if "%%i" == "}" (
  6.         (echo;!s!&echo;%%i)>>!n!.$
  7.         set /a n+=1
  8.         set "flag="
  9.     )else if "%%i" == "{" set flag=1
  10.     if defined flag echo;!s!>>!n!.$
  11.     set "s=%%i"
  12.     if not "!s:%keyWord%=!" == "!s!" set _!n!=1
  13. )
  14. for /f "delims=_=" %%i in ('set _') do move %%i.$ %%i.txt
  15. del *.$
  16. pause
复制代码
1

评分人数

TOP

回复 2# bailong360


    set "str=!str!!CR!%%i"这个字符串拼接用的绝,第一次看到这种用法,学到了,多谢。

TOP

回复 2# bailong360

应该是LF

TOP

回复 7# pcl_test
受教了

TOP

回复 3# pcl_test


    版主 我最近发帖老被PB -4,我感觉我按版规了啊,标题清楚,不是重复帖,为什么啊

TOP

回复 9# enoone1

直接发样本网盘分享链接,比你举长而不详的样例好很多

TOP

回复 10# pcl_test


    好吧,以后注意

TOP

回复 5# WHY


    变量用的很巧妙,膜拜下。

TOP

  1. context -e -f "/^\S+:/" -t /\}/ '1600万像素' test.txt
复制代码
下载:http://www.bathome.net/s/tool/?key=context

TOP

返回列表