我正在尝试使用findstr
代替grep
在准系统香草窗框上(这是一个必然要求)。我有一些相对较大的文件(1Gb +),我想提取那些不包含由MX
,MXnn
,BR
和BRnn
分隔的行。如果我正在写一个“真正的”正则表达式,那么
\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选项生成一个排除文件,但是一旦用户满足可能性,生成可能会开始变得有问题 - 正则表达式只是很多更容易
答案 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.txt
和BR[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%的防弹模式。