我需要编写一个批处理脚本来从管道分隔的文件中复制那些具有两个给定ID号之一的行。
例如,对于此文件:
Jack | 12 | Jacksonville
Jane | 34 | Minneapolis
必须硬编码的ID号是12和56。 因此,必须生成一个新的文本文件将包含:
Jack | 12 | Jacksonville
建议?
答案 0 :(得分:2)
我不确定你的意思" copy"。我假设您要创建一个仅包含匹配行的新文件。使用具有正则表达式的FINDSTR有一个非常简单的解决方案。每个正则表达式在第二列中查找ID,并允许在ID之前和之后的任意数量的空格(包括0)。
findstr /rb /c:"[^|]*| *12 *|" /c:"[^|]*| *56 *|" "file.txt" >"newFile.txt"
更新:2015-12-20
FINDSTR具有非常原始且完全非标准的正则表达式支持。缺乏交替强制每个数字替代需要整个正则表达式。如果您正在寻找更多替代方案,这可能会成为一个问题。
使用我的JREPL.BAT regex text processing tool有一个更简单的解决方案。它是纯脚本(hyrid JScript /批处理),可以在任何Windows机器上从XP开始本地运行。
call jrepl "^[^|]*\| *(12|56) *\|.*" $0 /jmatch /f "test.txt" /o "newFile.txt"
在括号内添加额外的管道分隔数字是一件简单的事情。
答案 1 :(得分:1)
文件IDFile.txt
中所有与12或56匹配的ID都将输出到新文件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