标题: [文本处理] [已解决] 批处理如何批量提取文本内指定行后连续的特定行内容? [打印本页]
作者: Ru_Evan 时间: 2023-10-12 16:10 标题: [已解决] 批处理如何批量提取文本内指定行后连续的特定行内容?
本帖最后由 Ru_Evan 于 2023-10-14 01:25 编辑
例如文本000.txt内容:
abcdef:
123456
234567
bcdefg:
345678
456789
cdefgh:
56789A
6789AB
即:结尾带:号的行,行前没有空格,其余的行前都带有3个空格;
需求:
将带有字符“bcdefg”的行后面连续的行前带3个空格的行提取出来,也就是:“ 345678”和“ 456789”
作者: 77七 时间: 2023-10-12 17:06
- @echo off
- cd /d "%~dp0"
- for /f "useback tokens=1 delims=[]" %%a in (`find /n "bcdefg" ^<"000.txt"`) do (
- set _"%%a"=1
- )
- (for /f "useback tokens=1* delims=[]" %%a in (`find /n /v "" ^<"000.txt"`) do (
- if "%%b" neq "" (
- if defined m (
- set str=%%b
- setlocal enabledelayedexpansion
- if "!str:~0,3!" equ " " (
- echo !str!
- endlocal
- ) else (
- endlocal
- set m=
- )
- )
- if defined _"%%a" (
- set m=1
- )
- )
- ))>out.txt
- pause
复制代码
作者: pd1 时间: 2023-10-12 17:53
- powershell -c "([regex]'(?<=bcdefg:\r\n)( \w+\r\n \w+)').Matches([io.file]::ReadAllText('000.txt'))|%{$_.Value}>out.txt"
复制代码
作者: Five66 时间: 2023-10-12 19:00
不知行否,第三方sed
http://bcn.bathome.net/s/tool/index.html?key=sed
结尾带:号的行后面有3个空格的行时,不能连续出现,输出文件名为___000.txt- sed -n "/^bcdefg:\r\?$/,/^[^ ]/{/ /p}" 000.txt >___000.txt
复制代码
作者: ppll2030 时间: 2023-10-12 21:46
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%A in ('findstr /n "bcdefg" "000.txt"') do set n=%%A
- set LF=0
- for /f "tokens=1* delims=:" %%i in ('findstr /n .* "000.txt"') do (
- set f=%%j
- set /a LF+=1
- set /a o=!n!+1
- set /a t=!n!+2
- if !LF! equ !o! echo;!f!>>000.out.txt
- if !LF! equ !t! echo;!f!>>000.out.txt
- )
复制代码
作者: Nsqs 时间: 2023-10-13 00:59
本帖最后由 Nsqs 于 2023-10-13 01:05 编辑
- PowerShell -noprofile -executionpolicy bypass "[regex]::Matches([System.IO.File]::ReadAllText('000.txt'),'(?<=bcdefg:\s+)( *?.+\s+)+?(?=\s+.+:)').value" >b.txt
复制代码
作者: qixiaobin0715 时间: 2023-10-13 09:29
本帖最后由 qixiaobin0715 于 2023-10-13 10:22 编辑
一组for循环也能实现吧:- @echo off
- setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (000.txt) do (
- if "%%i"=="bcdefg:" (
- set n=true
- ) else if defined n (
- set "str=%%i"
- if "!str:~-1!"==":" (
- set n=
- ) else (
- echo,%%i
- )
- )
- ))>out.txt
- pause
复制代码
开始代码考虑不周,有问题。现已修改。
作者: Ru_Evan 时间: 2023-10-13 22: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
作者: Nsqs 时间: 2023-10-14 05:30
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1 delims=:" %%1 in ('findstr -n "bcdefg:" "000.txt"')do set "line=%%1"
- (for /f "delims=" %%1 in ('more +%line% ^<"000.txt"')do (
- set "str=%%1"
- set "str=!str:~-1!"
- if "!str!"==":" goto :eof
- echo %%1
- ))> b.txt
复制代码
作者: qixiaobin0715 时间: 2023-10-14 08:58
回复 9# Nsqs
好像会有一定的局限性。如楼主提供的样本那样不会有什么问题,如果文件中存在多组“bcdefg:”就会出现一定的偏差。
作者: Nsqs 时间: 2023-10-14 09:06
回复 10# qixiaobin0715
他没说,就不写
作者: qixiaobin0715 时间: 2023-10-14 09:13
作者: 77七 时间: 2023-10-14 10:18
楼主能自行修改代码,可能只是借鉴一下思路。
- setlocal enabledelayedexpansion
- echo,[!num!] "%%b"
- endlocal
- set /a "num+=1"
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |