如何用Batch脚本提取每行第n个空格与第n个连字符间的文本
Batch脚本实现指定位置文本提取
需求说明
现有文本文件内容示例:
BALL - A 5122-ABCD-STH-PC2016/A 5122 : It's a duplicate. CIRCLE - B 612-DEFGH-STH-LAPTOP2005/B 612 : It's a duplicate.
需要用Batch脚本提取每行中第3个空格之后、第3个连字符之前的内容(不含分隔符),最终输出:
5122-ABCD 612-DEFGH
一、针对示例需求的硬编码实现
逻辑和cut -d ' ' -f 4- | cut -d '-' -f -2类似,直接针对固定次数编写脚本:
@echo off setlocal enabledelayedexpansion for /f "usebackq delims=" %%a in ("input.txt") do ( :: 跳过前3个空格分割的字段,取剩余部分 set "line=%%a" for /f "tokens=4* delims= " %%b in ("!line!") do ( :: 取前2个连字符分割的字段并拼接 for /f "tokens=1,2 delims=-" %%c in ("%%b") do ( echo %%c-%%d ) ) ) endlocal
将代码保存为extract.bat,把目标文本文件命名为input.txt放在同一目录,运行即可得到结果。
二、支持自定义次数的通用实现
如果需要灵活调整跳过的空格数、提取的连字符段数量,可通过字符串循环处理实现类似正则的灵活匹配:
@echo off setlocal enabledelayedexpansion :: 自定义参数:跳过前3个空格(从第4个字段开始),提取到第3个连字符前(取前2个连字符段) set "skip_spaces=3" set "take_hyphens=2" for /f "usebackq delims=" %%a in ("input.txt") do ( set "remaining=%%a" :: 跳过指定数量的空格分隔字段 for /l %%i in (1,1,%skip_spaces%) do ( for /f "tokens=1* delims= " %%b in ("!remaining!") do set "remaining=%%c" ) :: 提取指定数量的连字符段并拼接 set "result=" for /l %%i in (1,1,%take_hyphens%) do ( for /f "tokens=1* delims=-" %%b in ("!remaining!") do ( if defined result set "result=!result!-" set "result=!result!%%b" set "remaining=%%c" ) ) echo !result! ) endlocal
参数说明
skip_spaces=3:表示跳过前3个空格分隔的字段,从第4个字段开始处理take_hyphens=2:表示提取前2个连字符分隔的字段,拼接后就是到第3个连字符之前的内容
修改这两个参数即可适配不同需求,比如要跳过2个空格、提取到第4个连字符前,就设置skip_spaces=2、take_hyphens=3。
对比其他工具实现
如果有GNU工具链,用sed/awk/cut会更简洁,对应命令如下:
# sed实现 sed -E 's/^([^ ]*[ ]){3}//' input.txt | sed -E 's/(^([^-]*[-]){1}[^-]*).*/\1/' # awk实现 awk -F' ' '{print $4}' input.txt | awk -F'-' '{print $1 "-" $2}' # cut实现 cut -d ' ' -f 4- input.txt | cut -d '-' -f -2
内容的提问来源于stack exchange,提问作者Smeterlink
相关产品推荐
相关产品推荐

