Regex 为什么grep根据输入文件的大小显示不同的输出?
我对我的Regex 为什么grep根据输入文件的大小显示不同的输出?,regex,bash,unix,grep,Regex,Bash,Unix,Grep,我对我的grep命令的输出有点困惑,它似乎根据-f文件的大小来截断结果。例如,考虑一个1000行的字符串文件,模式.txt < /COD>,例如: adkgjwofjdjglkadjglkjasdfahdg dsklfjsldkfjaghwioeghsdlkjfld sdkljfsdkljghsdlfhkwhfklshdfo ... sdklfjsdklfjsdklfjslkjghdfkjj 和1Gbqueryfile.txt来搜索我的模式。当我跑的时候 grep -F -o -f patte
grep
命令的输出有点困惑,它似乎根据-f文件的大小来截断结果。例如,考虑一个1000行的字符串文件,<代码>模式.txt < /COD>,例如:
adkgjwofjdjglkadjglkjasdfahdg
dsklfjsldkfjaghwioeghsdlkjfld
sdkljfsdkljghsdlfhkwhfklshdfo
...
sdklfjsdklfjsdklfjslkjghdfkjj
和1Gbqueryfile.txt
来搜索我的模式。当我跑的时候
grep -F -o -f patterns.txt queryfile.txt | grep -c adkgjwofjdjglkadjglkjasdfahdg
在本例中,命令报告了0个匹配项,对应于patterns.txt
的第1行(adkgjwofjdjglkasdfahdg
),即使在queryfile.txt
中有35个匹配项。我通过将patterns.txt
文件减少到前10行来验证这一点。重新运行
grep -F -o -f patterns_reduced-list.txt queryfile.txt | grep -c adkgjwofjdjglkadjglkjasdfahdg
正确报告35次出现的adkgjwofjdjglkadjglkjasdfahdg
发生了什么事?除非。。。你的模式重叠了
检查此示例:
echo "xyxx" | grep -o -F yx$'\n'xy # output: xy
这会找到第二个模式(xy
),因此它不会找到第一个模式(yx
)
除非。。。你的模式重叠了
检查此示例:
echo "xyxx" | grep -o -F yx$'\n'xy # output: xy
这会找到第二个模式(xy
),因此它不会找到第一个模式(yx
)
除非。。。你的模式重叠了
检查此示例:
echo "xyxx" | grep -o -F yx$'\n'xy # output: xy
这会找到第二个模式(xy
),因此它不会找到第一个模式(yx
)
除非。。。你的模式重叠了
检查此示例:
echo "xyxx" | grep -o -F yx$'\n'xy # output: xy
这会找到第二个模式(xy
),因此它不会找到第一个模式(yx
)
适用于我(GNU grep 2.16)。您在哪个平台上运行?您使用的是哪个版本的grep
?您可以将数据简化为MCVE()吗?如何创建要传递到grep
的第一行\u模式.txt文本?我认为这是$(sed 1q patterns.txt)
的某个变体,但您应该显示该步骤。@dreamlax:对于每种可能的模式变体?:)为什么在第一次调用grep
时使用-f patternfile.txt
,而在第二次调用时忽略了-f
选项?据我所知,第一行\u of_patterns.txt
包含一个模式,而不是要搜索的文本。@user1016274:他的意思是这样的。这不是一个文件名,这是patterns.txt
中的第一个模式,适用于我(GNU grep 2.16)。您在哪个平台上运行?您使用的是哪个版本的grep
?您可以将数据简化为MCVE()吗?如何创建要传递到grep
的第一行\u模式.txt文本?我认为这是$(sed 1q patterns.txt)
的某个变体,但您应该显示该步骤。@dreamlax:对于每种可能的模式变体?:)为什么在第一次调用grep
时使用-f patternfile.txt
,而在第二次调用时忽略了-f
选项?据我所知,第一行\u of_patterns.txt
包含一个模式,而不是要搜索的文本。@user1016274:他的意思是这样的。这不是一个文件名,这是patterns.txt
中的第一个模式,适用于我(GNU grep 2.16)。您在哪个平台上运行?您使用的是哪个版本的grep
?您可以将数据简化为MCVE()吗?如何创建要传递到grep
的第一行\u模式.txt文本?我认为这是$(sed 1q patterns.txt)
的某个变体,但您应该显示该步骤。@dreamlax:对于每种可能的模式变体?:)为什么在第一次调用grep
时使用-f patternfile.txt
,而在第二次调用时忽略了-f
选项?据我所知,第一行\u of_patterns.txt
包含一个模式,而不是要搜索的文本。@user1016274:他的意思是这样的。这不是一个文件名,这是patterns.txt
中的第一个模式,适用于我(GNU grep 2.16)。您在哪个平台上运行?您使用的是哪个版本的grep
?您可以将数据简化为MCVE()吗?如何创建要传递到grep
的第一行\u模式.txt文本?我认为这是$(sed 1q patterns.txt)
的某个变体,但您应该显示该步骤。@dreamlax:对于每种可能的模式变体?:)为什么在第一次调用grep
时使用-f patternfile.txt
,而在第二次调用时忽略了-f
选项?据我所知,第一行\u of_patterns.txt
包含一个模式,而不是要搜索的文本。@user1016274:他的意思是这样的。这不是文件名,这是patterns.txt
中的第一个模式。我修改了原始问题以显示patterns.txt文件的外观。它很可能在patterns.txt中有两行不同的代码,可以与queryfile.txt中的同一行匹配。那会被认为是重叠吗?不,你不匹配线,你匹配部分线(除非那些图案匹配整条线)。使用二进制搜索收缩模式文件,直到找到与第一个模式重叠的模式。当你去掉所有重叠的模式,你会再次看到35个出现。好的,我想我更理解你的答案。你能给我一个或两个关于如何“收缩”(压缩?)模式文件以执行重叠模式的二进制搜索的提示吗?删除模式,直到没有观察到重叠(得到35)。二进制搜索方法只是一种快速查找内容的方法,因为它将状态空间减半。扔掉一半的图案,如果没有变化,扔掉另一半。重复这个步骤,直到找到问题所在。就是这样,非常感谢您的解释。我可以在不修改重叠模式的情况下从grep防止这种行为吗?我修改了ori