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

Multiline pattern with one line of any content included

我需要计算 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

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

您可以使用下面的 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

idk what pcregrep is and I don't have it on any of UNIX boxes my use 但你可以只使用 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 [=11=] RS} END{print gsub(/(^|\n)line 1\n[^\n]*\nline 3\n/,"",rec)}' file
3

我在 RE 的前面和后面添加了锚定,这样就不可能产生错误的匹配。

这可能对你有用(GNU sed 和 wc):

sed '1N;N;/fix line 1\n.*\nfix line 3/{x;s/^/\n/;x};$!D;x;s/.//p;d' file | wc -l

这会在整个文件中创建 3 行的移动 window,并在遇到所需模式时将换行符附加到保留 space。在文件末尾,使用 wc 计算换行符(减去 sed 附加的添加换行符)。

此解决方案还将满足交错模式的需求,因为它专门查看整个文件中的所有 3 行组。