我已经看到了几个我需要的例子,并且尝试修改它们,但没有成功。
起始信息:
a:b:c:d:e:f
所需格式:
a:b
信息将被粘贴在 1 个文本文件中paste_here.txt
,并且输出应转到一个新文件check.txt
。
我目前的尝试是:
@echo 关闭 设置本地 对于/f“tokens=1,2 delims=:”%%a在(paste_here.txt)中执行(echo %%a >> check.txt)
答案1
您的问题不清楚。提供示例输入和输出是件好事,但您也应该解释一下您的要求。
我假设每行都有多个以冒号分隔的列,并且您希望保留每行的前两列。我还假设列宽是可变的,即使您的示例每列只有一个字符。
您的代码仅保留第一列。保留第二列并不难:
@echo off
setlocal
for /f "tokens=1,2 delims=:" %%A in (paste_here.txt) do >>check.txt echo %%A:%%B
但有一个潜在的问题——如果缺少第二列,它将失败。例如,
a::c:d:e:f
将产生
a:c
因为 FOR /F 将连续的分隔符视为单个分隔符。
修复起来并不难,但需要一些高级的批处理技术。
您可以在外循环中保留整行,并使用搜索/替换将每列括在引号中。然后可以使用第二个循环来解析列和
~
以便在输出期间删除引号。需要延迟扩展才能处理在同一循环内设置和扩展的变量。
延迟扩展可打开或关闭,以保护
!
可能出现在内容中的变量。对于具有!
如果在启用延迟扩展的情况下扩展 FOR 变量内容,则内容将被破坏。外部 FOR /F 语句中的奇数选项语法是一种禁用 EOL 选项并将 DELIMS 设置为无的方法,以便它保留整行,而不管内容如何。
还要注意,使用括号并对整个文件重定向一次而不是每行重定向一次会更有效(更快)。
@echo off
setlocal disableDelayedExpansion
>check.txt (
for /f delims^=^ eol^= %%A in (paste_here.txt) do (
set "ln=%%A"
setlocal enableDelayedExpansion
set "ln="!ln::=":"!""
for /f "tokens=1,2 delims=:" %%B in ("!ln!") do echo %%~B:%%~C
endlocal
)
)
或者你可以使用混合 JScript/批处理实用程序,称为 REPL.BAT非常高效地一步完成您的任务。REPL.BAT 在 stdin 上执行正则表达式搜索/替换并将结果写入 stdout。它是纯脚本,可在 XP 及以上版本的任何 Windows 机器上运行。
type paste_here.txt | repl "^(.*?:.*?):.*" $1 >check.txt