批量查找仅每行前10个字符(在txt文件中)的数字和字母组合的字符串并打印整行

时间:2013-09-16 08:27:03

标签: string batch-file cmd find

我对批处理文件有疑问。我需要一个批处理文件,它会在每行前10个字母中找到一个数字和字母组合的字符串(在多个.txt文件中),并将整行打印成输出.txt文件。目前我一直在使用这个:

@echo off  
findstr "A1234 B5678" "*.txt"  
for /f "delims=" %%A in ('findstr "A1234 B5678" "*.txt"') do (echo %%A >> OUTPUTFILE.txt) 

所以我在上面寻找的是目录中所有txt文件中的字母A1234和B5678(仅作为示例)的组合,并将它们打印到outputfile.txt中。它运作得很好,但我需要改善这一点。我只希望批量只能在每行前10个字母中找到这个组合(A1234和B5678),并将整行打印到输出txt文件中。例如,我们将有一个多个txt文件,这些文件本身就有这样的行:

00 A1234 QWERTZ  
AA B5678 ASDFGH

Batch将检查字符串组合A1234和B5678的所有文件,并打印出包含该组合的整行。
我希望你们能理解我,因为我的英语不是最好的。另外我对cmd的经验也不是很多,所以如果可能的话,请尽可能简单(可理解):) 非常感谢!

4 个答案:

答案 0 :(得分:0)

如果您使用cmd设置为dead,则可以将findstr与regex标志一起使用,如下所示:

C:\>type test.txt
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678
00 A1234 QWERTZ
AA B5678 ASDFGH
BB A1234 B5678

C:\>findstr /R "^*[A][0-9]* [B][0-9]*$" test.txt
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678
BB A1234 B5678

- ab1

答案 1 :(得分:0)

如果我找到了你,你想在前10个字符中搜索多个特定的字母数字组合。我认为你可以用正则表达式做到这一点,但是 不幸的是,findstr无法处理其他模式。

findstr /r "(pattern1|pattern2)"

不起作用。所以你必须分支出grep来找到可以找到的窗口here n个模式的语法是:

grep -h -E -e "^.. ({PATTERN 1}|{PATTERN 2}|...|{PATTERN 2})" *.txt

因此,对于您的示例,您可以使用:

grep -h -E -e "^.. (A1234|B5678)" *.txt

在每个* .txt中搜索任意以2个随机字母开头,后跟空格后跟A1234或B5678并打印出该行的行。开头的-h会抑制该行文件名的输出。

答案 2 :(得分:0)

这使用名为findrepl.bat的辅助批处理文件,该文件类似于grep,但作为普通批处理文件运行 - 可以在此处找到 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

findrepl.bat在Windows Scripting Host中使用jscript,除非您的IT管理员已禁用WSH,否则它将起作用。

@echo off 
for %%a in (*.txt) do (
echo ============="%%a"================>>search
type "%%a"|findrepl "^.. (A1234|B5678)">>search 
)
ren search search.txt

答案 3 :(得分:0)

有另一种方法可以做到这一点有点复杂,但它不依赖于额外的代码。 它将当前目录中的所有txt文件切成行。这些行的前10个字符被送入findstr。如果findstr成功,则将该行回显到控制台。

使用以下批处理文件:

@echo off
setlocal
for /f "delims=" %%I in ('dir/B *.txt') do (
    for /f "delims=" %%J in (%%I) do (
        set "_=%%J"
        call echo %%_:~0,10%%|findstr "PATTERN1 PATTERN2"&&call echo %%_%%
    )
)
endlocal
goto:eof

对于裂缝:我知道有ENABLEDELAYEDEXPANSION。因此,使用

可以避免呼叫方式
setlocal ENABLEDELAYEDEXPANSION

        echo !_:~0,10!|findstr "PATERN1 PATERN2"&&call echo !_!

但我认为这是一种糟糕的风格,因为这会导致问题,特别是如果你想要回应的内容包括'!'所以我总是在我的例子中使用call和double %%样式,除了DELAYEDEXPANSION是无法避免的。