findstr查询包括制表符

时间:2016-10-25 12:05:39

标签: regex windows batch-file cmd findstr

我正在尝试使用findstr代替grep在准系统香草窗框上(这是一个必然要求)。我有一些相对较大的文件(1Gb +),我想提取那些不包含由MXMXnnBRBRnn分隔的行。如果我正在写一个“真正的”正则表达式,那么

\t(MX|BR)(..)?\t

会掩盖它。我不介意分两个阶段,但我不能为我的生活似乎包括分隔符标签。

到目前为止,我有:

findstr /V MX source.txt >> temp.txt
findstr /V BR temp.txt >> dest.txt

由于数据的性质确实是一个好的工作,但我真的宁愿使用类似的东西:

findstr /R /V "\t(MX|BR)(..)?\t" source.txt >> dest.txt

我尝试过双斜线,escape sequences等,但似乎是在圈子里跑来跑去。

如果我可以提供帮助,我不愿意诉诸VBScript。

任何想法,鉴于香草窗的限制?

修改

我已经考虑使用/ G选项生成一个排除文件,但是一旦用户满足可能性,生成可能会开始变得有问题 - 正则表达式只是很多更容易

2 个答案:

答案 0 :(得分:1)

命令行或批处理文件中的可能解决方案是使用:

%SystemRoot%\System32\findstr.exe /V /R /C:"\<BR[0-9]*\>" /C:"\<MX[0-9]*\>" "source.txt"

文件source.txt搜索区分大小写,包含 行,因为/V BR为0或更多数字 MX由于\<\>因使用/R两个常规而使用\<BR[0-9]*\>\<MX[0-9]*\>,因此整数字为0或更多表达式搜索字词source.txtBR[0-9]*,与 FINDSTR 合并逻辑OR。

这可能已经足以过滤MX[0-9]*了。但它也会过滤掉包含%SystemRoot%\System32\findstr.exe /V /R /C:"[ ]BR[0-9]*[ ]" /C:"[ ]MX[0-9]*[ ]" "source.txt" findstr /?的行,这些行包含其他单词分隔字符而不是水平制表符。

可以在批处理文件中使用:

private void OpenDialog() 
{
   Form2 f = new Form2();
   //show the form as a Dialog and returns the DialogResult
   if (f.ShowDialog() == DialogResult.OK) //only if the user pressed OK
   {
        //assign the value of the textbox in form2 to label1
        label1.Text = f.textBox1.Text;
   }     
}

注意:在4对方括号中的每一对之间,批处理文件中必须有1个水平制表符。浏览器根据HTML规范将这4个制表符显示为1个或多个空格。

打开命令提示符窗口并运行Update以获取有关 FINDSTR 的更多信息。

也许还可以阅读Stack Overflow文章

What are the undocumented features and limitations of the Windows FINDSTR command?

答案 1 :(得分:1)

Afaics没有语法可以直接指定水平制表符。 Findstr regex看起来很基础,它们没有\ s \ t \ d,例如:-)。 但是,您可以使用输入文件来指定搜索模式。在此文件内,您可以按实际使用制表符。 您原始帖子"\t(MX|BR)(..)?\t"的示例为

" (MX|BR)(..)? "

不带引号。前导和尾随空格是键入并保存在文件中的选项卡。 然后,您可以将findstr与类似的东西一起使用:

findstr /R /G:patternFileWithTabs.txt sourceFile.txt

另外,您可以通过指定独占模式来完成大部分工作。 如果您排除所有字母数字,通用分隔符,其他空格字符,则剩下的唯一可能就是制表符。 例如,我一直在搜索默认正则表达式中的序列:

"\t\tUnknown\t\t\t\t0\t"

在我的用例中,我可以使用findstr对其进行grep填充:

findstr /R "[ a-z0-9][ a-z0-9]Unknown[ a-z0-9]*0[ a-z0-9]" logfile.txt

当然,这取决于您拥有的实际数据。从理论上讲,该模式也可以匹配其他字符串,但是这些其他字符串不会出现在我的源文件中,因此可以正常工作。 大多数时候,您不需要100%的防弹模式。