包含任意内容的一行的多行模式

时间:2015-02-14 15:45:21

标签: regex bash sed grep pcregrep

我需要计算htm文件中3行的多行模式的出现次数。问题是我在第1行和第3行中有修复内容,但第2行的内容未修复,它可以更改(该文件是一个日志)。这是我的意思的一个例子:

fix line 1
changing line 2
fix line 3

我已经搜索了解决方案,但是没有找到100%合适的解决方案... pcregrep应该可行,但是如何包含更改的第2行?到目前为止,我只能寻找两条修复线。 代码本身就是问题,但输出对我来说非常易于使用

pcregrep -Mc '^line1\n^line2\n^line3' file

或者我应该使用sed代替? 代码有效,但输出 使用复杂。如何处理它来计算这种多线模式的出现?因为第1行和第3行之间只有一行,这很重要。

sed -n '/^line1/,/^line3/=' file

我希望你能帮助我。非常感谢你!

2 个答案:

答案 0 :(得分:1)

您可以使用以下pcregrep命令。

pcregrep -Mc '^line 1\n[^\n]*\nline 3' file

示例:

$ cat file
line 1
changing line 2
line 3
foo
bar
buz
line 1
changing line
line 3
foo
bar
buz
line 1
bar
line 3
$ pcregrep -Mc '^line 1\n[^\n]*\nline 3' file
3

答案 1 :(得分:0)

idk pcregrep是什么,我没有在我使用的任何UNIX机器上使用它,但你可以使用awk,因为它可用于所有UNIX安装,例如:针对@ AvinashRaj的示例输入文件运行并使用GNU awk进行多字符RS:

$ awk -v RS='^$' '{print gsub(/(^|\n)line 1\n[^\n]*\nline 3\n/,"")}' file
3

或与任何awk:

$ awk '{rec=rec $0 RS} END{print gsub(/(^|\n)line 1\n[^\n]*\nline 3\n/,"",rec)}' file
3

我添加锚定到RE的前面+后面,使得无法产生错误的匹配。