0

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

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

4

3 回答 3

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
于 2015-02-14T15:51:29.037 回答
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 的正面+背面添加了锚点,以防止产生错误匹配。

于 2015-02-14T16:58:42.900 回答
0

这可能对你有用(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 行的移动窗口,并在遇到所需模式时将换行符附加到保留空间。在文件末尾,使用 wc 计算换行符(减去 sed 附加的添加换行符)。

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

于 2015-02-16T18:23:18.307 回答