谁能建议一个匹配 4 个连续文本行的正则表达式模式?

发布于 2024-11-27 23:05:49 字数 443 浏览 2 评论 0原文

我正在尝试解析一个大数据文件。在该文件中,有 3 行或 4 行数据组,由空行分隔。例如:

Data Group One Name
Data Group One Datum 1
Data Group One Datum 2
Data Group One Datum 3

Data Group Two Name
Data Group Two Datum 1
Data Group Two Datum 2

Data Group Three Name
Data Group Three Datum 1
Data Group Three Datum 2
Data Group Three Datum 3

我正在寻找一种快速方法来提取具有 4 行的所有数据组(忽略所有 3 行组)。有没有办法使用正则表达式查找文本文件中所有 4 行组?或者任何其他建议的(也许使用 awk 或 sed 的东西)方法来做到这一点?

I am trying to parse a large data file. In the file there are groups of either 3 or 4 lines of data separated by a blank line. Eg:

Data Group One Name
Data Group One Datum 1
Data Group One Datum 2
Data Group One Datum 3

Data Group Two Name
Data Group Two Datum 1
Data Group Two Datum 2

Data Group Three Name
Data Group Three Datum 1
Data Group Three Datum 2
Data Group Three Datum 3

I am looking for a quick way to extract all groups of data that have 4-lines (ignoring all of the 3-line groups). Is there a way with regex to find all groups of 4-lines in a text file? Or any other suggested (perhaps something using awk or sed) methods to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

末蓝 2024-12-04 23:05:49

不是很漂亮,但这应该可以:

/[^\n]+\n[^\n]+\n[^\n]+\n[^\n]+(?!(?:\n [^\n]+))/

/(?:[^\n]+\n){3}[^\n]+(?!(?:\n[^\ n]+))/

基本上,您正在寻找一个或更多非换行符,然后是一个新行,一个或多个非换行符,然后是一个新行,等等。

编辑:修复了我的正则表达式,它匹配超过 4 行的块。我为另一行文本添加了否定前瞻。

Not really pretty but this should work:

/[^\n]+\n[^\n]+\n[^\n]+\n[^\n]+(?!(?:\n[^\n]+))/

or

/(?:[^\n]+\n){3}[^\n]+(?!(?:\n[^\n]+))/

Basically, you're looking for one or more non-new-line characters, then a new line, one or more non-new-line character, then a new line, etc.

EDIT: Fixed my regex, it matched for blocks of more than 4 lines. I added a negative lookahead for another line of text.

把回忆走一遍 2024-12-04 23:05:49

我还没有测试过它,但这应该适用于 awk 脚本:

#!/bin/awk -f
BEGIN {
        count = 0;
        lines = "";
}
{    
    if ($0 != "") {
        lines = lines \n $0;
        count++;
    } else if (count == 4) {
        print lines;       
    }
    if ($0 == "") {
        count = 0;
        lines = "";
    }
}

I haven't tested it, but this should work for an awk script:

#!/bin/awk -f
BEGIN {
        count = 0;
        lines = "";
}
{    
    if ($0 != "") {
        lines = lines \n $0;
        count++;
    } else if (count == 4) {
        print lines;       
    }
    if ($0 == "") {
        count = 0;
        lines = "";
    }
}
猫九 2024-12-04 23:05:49

您可以解决换行符 - 伪代码示例:

\n\n 1-or-more-characters \n 1-or-more-characters \n 1-or-more-characters \n 1-or-more-characters \n\n

You could work around line break characters - pseudo code example:

\n\n 1-or-more-characters \n 1-or-more-characters \n 1-or-more-characters \n 1-or-more-characters \n\n
不醒的梦 2024-12-04 23:05:49
(?:.+\n){1,3}

这将捕获 1 行、2 行和 3 行。

这是贪婪的匹配。

如果您需要 3 或 4 行,您可以使用:

(?:.+\n){3,4}

或者您可以使用:

(?:[^\n]+\n){3,4}

我已经在 https://regex101.com/ 中测试了它

(?:.+\n){1,3}

this will capture 1 line, 2 lines and 3 lines.

this is greedy matches.

if you need 3 or 4 lines you can use:

(?:.+\n){3,4}

or you can use:

(?:[^\n]+\n){3,4}

I have tested it in https://regex101.com/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文