我需要编写一个批处理脚本来从具有两个给定 ID 号之一的管道分隔文件中复制这些行。
例如,对于这个文件:
Jack | 12 | Jacksonville
Jane | 34 | Minneapolis
必须硬编码的 ID 号是 12 和 56。因此必须生成一个新的文本文件,其中包含以下内容:
Jack | 12 | Jacksonville
建议?
我需要编写一个批处理脚本来从具有两个给定 ID 号之一的管道分隔文件中复制这些行。
例如,对于这个文件:
Jack | 12 | Jacksonville
Jane | 34 | Minneapolis
必须硬编码的 ID 号是 12 和 56。因此必须生成一个新的文本文件,其中包含以下内容:
Jack | 12 | Jacksonville
建议?
我不确定您所说的“复制”是什么意思。我假设您要创建一个仅包含匹配行的新文件。使用带有正则表达式的 FINDSTR 有一个非常简单的解决方案。每个正则表达式在第 2 列中查找 ID,并允许在 ID 前后有任意数量的空格(包括 0)。
findstr /rb /c:"[^|]*| *12 *|" /c:"[^|]*| *56 *|" "file.txt" >"newFile.txt"
更新:2015-12-20
FINDSTR 具有非常原始且完全非标准的正则表达式支持。缺乏交替迫使每个数字替代都需要整个正则表达式。如果您正在寻找更多替代方案,这可能是一个问题。
使用我的JREPL.BAT 正则表达式文本处理工具有一个更简单的解决方案。它是纯脚本(混合 JScript/批处理),可以在 XP 以后的任何 Windows 机器上本地运行。
call jrepl "^[^|]*\| *(12|56) *\|.*" $0 /jmatch /f "test.txt" /o "newFile.txt"
添加额外的管道分隔数字以在括号内搜索是一件简单的事情。
文件中所有匹配 12 或 56 的 IDIDFile.txt
都将输出到一个新文件MatchingIDs.txt
中。
@echo off
setlocal enabledelayedexpansion
set line=0
for /f "tokens=2 delims=|" %%a in (IDFile.txt) do (
set num=%%a
set num=!num: =!
if !num!==12 set bool=true
if !num!==56 set bool=true
if "!bool!"=="true" call :GETLINE
set /a line+=1
set bool=false
)
:GETLINE
if not %line%==0 set skip=skip=%line%
for /f "%skip% tokens=* delims=" %%b in (IDFile.txt) do (
echo %%b >>MatchingIDs.txt
goto :BREAK
)
:BREAK