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

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

本帖最后由 Ru_Evan 于 2023-10-14 01:25 编辑

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

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

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  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
复制代码
bat小白,请多指教!谢谢!

TOP

  1. powershell -c "([regex]'(?<=bcdefg:\r\n)(   \w+\r\n   \w+)').Matches([io.file]::ReadAllText('000.txt'))|%{$_.Value}>out.txt"
复制代码

TOP

不知行否,第三方sed
http://bcn.bathome.net/s/tool/index.html?key=sed
结尾带:号的行后面有3个空格的行时,不能连续出现,输出文件名为___000.txt
  1. sed -n "/^bcdefg:\r\?$/,/^[^ ]/{/   /p}" 000.txt >___000.txt
复制代码

TOP

  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. )
复制代码

TOP

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

TOP

本帖最后由 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

评分人数

    • Nsqs: 乐于助人技术 + 1

TOP

本帖最后由 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

TOP

  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
复制代码

TOP

回复 9# Nsqs
好像会有一定的局限性。如楼主提供的样本那样不会有什么问题,如果文件中存在多组“bcdefg:”就会出现一定的偏差。

TOP

回复 10# qixiaobin0715


    他没说,就不写

TOP

TOP

楼主能自行修改代码,可能只是借鉴一下思路。
  1. setlocal enabledelayedexpansion
  2. echo,[!num!] "%%b"
  3. endlocal
  4. set /a "num+=1"
复制代码
bat小白,请多指教!谢谢!

TOP

返回列表