找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30135|回复: 12

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

[复制链接]
发表于 2016-3-20 10:16:18 | 显示全部楼层 |阅读模式
BAT如何获取指定行所在的文本区域
比如test.txt文本内容
安卓手机低配一:
{
     oppo:电池2000毫安
     oppo:充电一分钟通话一小时
     oppo:内存16G
    ……
}
功能机配置:不做配置描述
    诺基亚:1050
安卓手机标配一:
{
    华为:电池3000毫安
     华为:1600万像素
     华为:6英寸
    ……
}
安卓手机低配二:
{
    类似上面格式
    ……
}
安卓手机高配二:
{
    类似上面格式,每个配置项都是唯一的
    ……
}
……文本里还有很多低配置/高配置/标配置,类似上面配置格式



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

评分

参与人数 1PB -4 收起 理由
pcl_test -4 未按版规发帖

查看全部评分

发表于 2016-3-20 11:00:39 | 显示全部楼层
本帖最后由 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技术 +2 收起 理由
enoone1 + 1 字符拼接+10086
WHY + 1 {上面少一行

查看全部评分

发表于 2016-3-20 14:54:42 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
enoone1 + 1 不明觉厉+1

查看全部评分

发表于 2016-3-20 15:36:57 | 显示全部楼层
本帖最后由 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技术 +2 收起 理由
enoone1 + 1 根据特定分区符定位区域+1
codegay + 1 1

查看全部评分

发表于 2016-3-20 16:35:39 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
enoone1 + 1 666666

查看全部评分

 楼主| 发表于 2016-3-20 20:26:15 | 显示全部楼层
回复 2# bailong360


    set "str=!str!!CR!%%i"这个字符串拼接用的绝,第一次看到这种用法,学到了,多谢。
发表于 2016-3-20 20:44:44 | 显示全部楼层
回复 2# bailong360

应该是LF
发表于 2016-3-20 20:48:02 | 显示全部楼层
回复 7# pcl_test
受教了
 楼主| 发表于 2016-3-20 21:06:20 | 显示全部楼层
回复 3# pcl_test


    版主 我最近发帖老被PB -4,我感觉我按版规了啊,标题清楚,不是重复帖,为什么啊
发表于 2016-3-20 21:12:40 | 显示全部楼层
回复 9# enoone1

直接发样本网盘分享链接,比你举长而不详的样例好很多
 楼主| 发表于 2016-3-20 21:18:10 | 显示全部楼层
回复 10# pcl_test


    好吧,以后注意
 楼主| 发表于 2016-3-20 23:10:29 | 显示全部楼层
回复 5# WHY


    变量用的很巧妙,膜拜下。
发表于 2016-3-21 02:14:53 | 显示全部楼层
  1. context -e -f "/^\S+:/" -t /\}/ '1600万像素' test.txt
复制代码
下载:http://www.bathome.net/s/tool/?key=context
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:19 , Processed in 0.022147 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表