2013-11-25 28 views
0

下面的模式效果很好,我得到了数百个结果。添加OR时,Regex模式失败?

xargs pcregrep -M "select.*table(.)*" >> $grep_out 

这将返回(样品):

./mo/module1/module1.4gl: call error("Prepare select_table failed.") 
./mo/module1/module1.4gl: declare select_table cursor with hold for sel_table 
./mo/module1/module1.4gl: let prep = " select * from table ", 

当我添加一个或最后的结束字符,我得到0的结果:

xargs pcregrep -M "select.*table(.|\n)*" >> $grep_out 

这使得完全没有意义的我。我正在添加一个OR - 逻辑上,它不应该做任何事情,只是扩展我的搜索,并增加我的结果。不要减少它们。这里发生了什么?

+1

请添加样本数据 – iruvar

+0

我无法用您的样本数据重现此内容。用'bash'测试4.2.45(1) - 释放和'pcregrep' 8.31。 – user2719058

回答

1

由于您使用的是多行,因此您将匹配文件中的第一个select table,然后由于(.\n)*,您将匹配文件的其余部分。请注意只有单个匹配:

$ pcregrep -M "select.*table(.|\n)*" * 
file.txt:call error("Prepare select_table failed.") 
declare select_table cursor with hold for sel_table 
let prep = " select * from table ", 

但是,OR组件没有问题。

$ pcregrep -M "FOO(\n)" * 
file.txt:FOO 
file.txt:FOO 

$ pcregrep -M "FOO(.)" * 
file.txt:FOOF 

$ pcregrep -M "FOO(.|\n)" * 
file.txt:FOO 
file.txt:FOOF 
file.txt:FOO 

所以,你的问题在别处。

+0

为什么你一直把星号放在引号之外?我知道它会匹配文件的其余部分 - 目的是在“(。| \ n)”之后放入另一个字符串,但我已经将问题缩小到了这个范围。谢谢你试图帮助测试这个,但你没有测试这个案例 - 这是在第二个字之后。在第一个单词适用于我之后加上“(。| \ n)”。 – user1472747

+0

@ user1472747星号在引号之外,因为它正在测试当前目录中的所有文件;这是一个通配表达式,而不是正则表达式的一部分。 – beerbajay

+0

@ user1472747我确实在测试案例;这是我的答案中的第一件事,其中'file.txt'包含您的待匹配行。使用第二个正则表达式测试哪些工作。 – beerbajay