Windows批处理文件-删除分隔符后的数据

Windows批处理文件-删除分隔符后的数据

我已经看到了几个我需要的例子,并且尝试修改它们,但没有成功。

起始信息:

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

相关内容