Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么grep根据输入文件的大小显示不同的输出?_Regex_Bash_Unix_Grep - Fatal编程技术网

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
和1Gb
queryfile.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