【问题标题】:Batch to find a string of number&letter combination only in first 10 characters (in a txt file) per row and print the whole row批量查找每行前 10 个字符(在 txt 文件中)的数字和字母组合字符串并打印整行
【发布时间】:2013-09-20 08:03:22
【问题描述】:

我有一个关于批处理文件的问题。我需要一个批处理文件,它会在每行的前 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 的经验也不是很丰富,所以如果可能的话,请尽可能简单(易于理解):)。
非常感谢!

【问题讨论】:

    标签: string batch-file cmd find


    【解决方案1】:

    还有另一种更复杂的方法,但它不依赖额外的代码。 它将当前目录中的所有 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 是无法避免的。

    【讨论】:

    • 这很好用——当我运行批处理文件时,它会正确搜索!还有一个请求 - 我怎样才能使它将结果打印到 txt 文件中?
    • 哦,没关系,想通了,在“echo %%_%%”部分之后添加了“>> output.txt”,效果很好!感谢您的帮助,也感谢其他所有人! :)
    • 最好使用来自外部的重定向。如果 filter.bat 是您的批处理文件,您可以使用“filter>output.txt”启动它,批处理文件的所有输出都将被重定向到 output.txt。
    • 如果我这样做,它会打印两次结果 - 不知道为什么,但它就是这样......
    • 也许你没有从批处理文件中删除“internal >> output.txt”?
    【解决方案2】:

    这使用了一个名为 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】:

      如果我没听错的话,您希望在前 10 个字符中搜索多个特定的字母数字组合。我认为您可以使用正则表达式来做到这一点,但是 不幸的是 findstr 无法处理替代模式。

      findstr /r "(pattern1|pattern2)"
      

      不起作用。所以你必须分支到 grep 的 windows 可以找到 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 禁止输出该行的文件名。

      【讨论】:

      • 这正是我想要的。我会检查/测试它并让你知道结果。
      • 所以我在我的工作 PC 上没有管理员权限,所以我无法安装 grep。但是有没有其他方法可以做到这一点?
      • 那么您不需要管理员权限来安装 grep,您可以将带有二进制文件的 zip 文件解压缩到您的批处理文件夹中。
      • 你也可以看看我的第二个答案,不需要额外的要求。
      【解决方案4】:

      如果您对使用 cmd 不以为然,可以使用 findstr 和正则表达式标志,如下所示:

      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

      【讨论】:

      • 不是我的意思。我不需要 A1234 和 B5678 放在同一行。我需要一批在行的前 10 个字母中找到其中一个(A1234 或 B5678)并打印出整行。
      • Findstr 不支持条件,你可以在一行中使用 grep ('grep -E "[A]{1}[1-4]{4}|[B]{1}[ 5-8]{4}" test.txt').
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多