我正在寻找一种在文件中搜索多行模式的方法。
例如,假设这个数字列表是我的输入文件:
3
2
5
4
8
2
5
4
2
4
2
5
4
如果我想搜索第 2-4 行(包括)的实例,我希望结果是:
3
因为那是那些特定行被精确重复的次数。我还希望它适用于任何给定数量的行,以及文件中任何给定的行号范围。
我正在寻找一种在文件中搜索多行模式的方法。
例如,假设这个数字列表是我的输入文件:
3
2
5
4
8
2
5
4
2
4
2
5
4
如果我想搜索第 2-4 行(包括)的实例,我希望结果是:
3
因为那是那些特定行被精确重复的次数。我还希望它适用于任何给定数量的行,以及文件中任何给定的行号范围。
您可以使用pcregrep,它在大多数发行版中都可用。以下命令匹配固定字符串。
解释
从手册页看,pcgrep 是“一个与 Perl 兼容的正则表达式的 grep”。
-M
: 匹配多行的正则表达式-c
:输出匹配的数量(计数),而不是匹配本身^2\n5\n4$
: 2, 5, 4 的正则表达式,每个在单独的行上。取而代之的是特定线条的图案
问题中的后续评论表明要匹配的模式不是固定字符串,而是一般的“第 2 到 4 行”。在这里,您可以使用命令替换来解析输入文件中的行。
解释
tail -n+2 input.txt
: 输出文件,从第 2 行开始head -n3
: 只输出前三行\Q...\E
:引用基本字符串匹配的...
部分,而不是正则表达式匹配(假设命令的输出不包含\E
)。请注意,它假定 的输出的最后几行
sed ... input.txt
不为空,因为命令替换 ($(...)
) 会去除所有尾随换行符。在职的:
-0777
=> slurp 模式,意思是读入整个文件。-p
=> 在读取下一条记录之前,将当前记录打印$_
到标准输出。-l
=> 设置 RS = ORS = "\n"/^2\n5\n4$/mg
隐式应用于$_
,在我们的例子中是整个文件记住。/m
除了字符串开头和字符串结尾之外,正则表达式修饰符也应匹配行结尾和开头。/g
修饰符将获得$_
又名整个文件中的所有匹配项。高温高压
您的帖子没有提到对正则表达式支持的任何要求,因此我假设您将搜索固定的文字文本字符串。
这可能不是你见过的最快的算法,但如果你有足够的时间,它会起作用。它有一个小缺陷,如果有多个 N 行模式以相同的第一行开头并且具有相同的 SHA256 哈希,则会给出不正确的结果。它假定所有可能的 N 行模式都具有唯一的 SHA256 哈希值。
在大文件上运行速度会非常缓慢,尤其是那些包含多次出现模式第一行的文件。
输出:
要求:
第二个参数必须至少等于或大于第一个参数。如果您违反此规定,我不保证输出。
免责声明:
\
如果字符和/或$
出现在作为模式包含的任何行中,这将不起作用。awk
即使它们被反斜杠转义,也很难将这些字符作为模式的一部分来处理。怎么样
使用您选择的分隔符......
22 5 44
您需要正则表达式来防止在 .... ... 或类似情况下匹配