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

[文本处理] [已解决] 批处理如何批量提取文本内指定行后连续的特定行内容?

[复制链接]
发表于 2023-10-12 16:10:09 | 显示全部楼层 |阅读模式
本帖最后由 Ru_Evan 于 2023-10-14 01:25 编辑

例如文本000.txt内容:
abcdef:
   123456
   234567
bcdefg:
   345678
   456789
cdefgh:
   56789A
   6789AB
即:结尾带:号的行,行前没有空格,其余的行前都带有3个空格;

需求:
将带有字符“bcdefg”的行后面连续的行前带3个空格的行提取出来,也就是:“   345678”和“   456789”

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-10-12 17:06:42 | 显示全部楼层
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "useback tokens=1 delims=[]" %%a in (`find /n "bcdefg" ^<"000.txt"`) do (
  4.         set _"%%a"=1
  5. )
  6. (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"000.txt"`) do (
  7.         if "%%b" neq "" (
  8.                 if defined m (
  9.                         set str=%%b
  10.                         setlocal enabledelayedexpansion
  11.                         if "!str:~0,3!" equ "   " (
  12.                                 echo !str!
  13.                                 endlocal
  14.                         ) else (
  15.                                 endlocal
  16.                                 set m=
  17.                         )
  18.                 )
  19.                 if defined _"%%a" (
  20.                         set m=1
  21.                 )
  22.         )
  23. ))>out.txt
  24. pause
复制代码
发表于 2023-10-12 17:53:18 | 显示全部楼层
  1. powershell -c "([regex]'(?<=bcdefg:\r\n)(   \w+\r\n   \w+)').Matches([io.file]::ReadAllText('000.txt'))|%{$_.Value}>out.txt"
复制代码
发表于 2023-10-12 19:00:54 | 显示全部楼层
不知行否,第三方sed
http://bcn.bathome.net/s/tool/index.html?key=sed
结尾带:号的行后面有3个空格的行时,不能连续出现,输出文件名为___000.txt

  1. sed -n "/^bcdefg:\r\?$/,/^[^ ]/{/   /p}" 000.txt >___000.txt
复制代码
发表于 2023-10-12 21:46:53 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=:" %%A in ('findstr /n "bcdefg" "000.txt"') do set n=%%A
  4. set LF=0
  5. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "000.txt"') do (
  6.     set f=%%j
  7.     set /a LF+=1
  8.     set /a o=!n!+1
  9.     set /a t=!n!+2
  10.     if !LF! equ !o! echo;!f!>>000.out.txt
  11.     if !LF! equ !t! echo;!f!>>000.out.txt
  12. )
复制代码
发表于 2023-10-13 00:59:49 | 显示全部楼层
本帖最后由 Nsqs 于 2023-10-13 01:05 编辑
  1. PowerShell -noprofile -executionpolicy bypass "[regex]::Matches([System.IO.File]::ReadAllText('000.txt'),'(?<=bcdefg:\s+)( *?.+\s+)+?(?=\s+.+:)').value" >b.txt
复制代码
发表于 2023-10-13 09:29:24 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2023-10-13 10:22 编辑

一组for循环也能实现吧:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%i in (000.txt) do (
  4.     if "%%i"=="bcdefg:" (
  5.         set n=true
  6.     ) else if defined n (
  7.         set "str=%%i"
  8.         if "!str:~-1!"==":" (
  9.             set n=
  10.         ) else (
  11.             echo,%%i
  12.         )
  13.     )
  14. ))>out.txt
  15. pause
复制代码
开始代码考虑不周,有问题。现已修改。

评分

参与人数 1技术 +1 收起 理由
Nsqs + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-10-13 22:36:36 | 显示全部楼层
本帖最后由 Ru_Evan 于 2023-10-14 13:54 编辑

回复 7# qixiaobin0715

考虑周全,代码精简,运行快速。。十分感谢!!
根据我这边实际情况,稍微改了下,运行得很好,再次感谢。。。
@echo off
set /p "var=提取词组项:"
set /p "out=输出文件名:"
set /a num=1

for /d %%a in (*) do (
        pushd "%~dp0\%%a"
        for /r %%b in (*.txt) do (
                setlocal enabledelayedexpansion
                echo,[!num!] "%%b"
                (for /f "usebackq delims=" %%i in ("%%b") do (
                        set "str=%%i"
                        if "!str:*:=!"=="" (
                                if not "!str:%var%=!"=="!str!" (
                                        set n=true
                                ) else if defined n (
                                        if "!str:~-1!"==":" (
                                                set n=
                                        ) else (
                                                echo,%%i
                                        )
                                )
                        )
                ))>>"%~dp0\%out%.txt"
                endlocal
                set /a "num+=1"
        )
)

pause
exit
发表于 2023-10-14 05:30:00 | 显示全部楼层
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1 delims=:" %%1 in ('findstr -n "bcdefg:" "000.txt"')do set "line=%%1"
  3. (for /f "delims=" %%1 in ('more +%line% ^<"000.txt"')do (
  4.         set "str=%%1"
  5.         set "str=!str:~-1!"
  6.         if "!str!"==":" goto :eof
  7.         echo %%1
  8. ))> b.txt
复制代码
发表于 2023-10-14 08:58:13 | 显示全部楼层
回复 9# Nsqs
好像会有一定的局限性。如楼主提供的样本那样不会有什么问题,如果文件中存在多组“bcdefg:”就会出现一定的偏差。
发表于 2023-10-14 09:06:59 | 显示全部楼层
回复 10# qixiaobin0715


    他没说,就不写
发表于 2023-10-14 09:13:12 | 显示全部楼层
发表于 2023-10-14 10:18:29 | 显示全部楼层
楼主能自行修改代码,可能只是借鉴一下思路。
  1. setlocal enabledelayedexpansion
  2. echo,[!num!] "%%b"
  3. endlocal
  4. set /a "num+=1"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 11:57 , Processed in 0.026913 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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