【问题标题】:Capturing multiple regexp patterns on the same line在同一行上捕获多个正则表达式模式
【发布时间】:2018-01-19 04:44:37
【问题描述】:

这就是我想要做的。我有一个文件,其中的行以多种方式分隔,我想根据这些行中的模式捕获多个子字符串。

所以示例行将是这样的:

servername.domain:2017 08 07.SomeText1.otherIrrelevantStuff;SomeText2.MoreStuff
^^^^^^^^^^        ^^^^^^^^^^ ^^^^^^^^^                      ^^^^^^^^^

换句话说,我想在文件的每一行中捕获“servername”、“2017 08 07”、“SomeText1”和“SomeText2”。

我尝试使用 perl -P 和正向前瞻/后向来做到这一点,但只有第一个有效。每行的结果也应该打印在一行中(因此通过多个 grep -oP 的管道是不可接受的)。

你会怎么做?

【问题讨论】:

  • 请将该示例输入的所需输出添加到您的问题中。
  • awk -F '[.:;]' '{print $1,$3,$4,$6}' file?
  • 文件每行所需的输出应该是这样的: servername 2017 08 07 SomeText1 SomeText2

标签: regex linux awk sed grep


【解决方案1】:

在 awk 中,将所需的正则表达式添加到 match:

$ awk '
BEGIN { OFS="," }
{
    while(match($0,/servername|2017 08 07|SomeText1|SomeText2/)) {
        b=b (b==""?"":OFS)substr($0,RSTART,RLENGTH)
        $0=substr($0,RSTART+RLENGTH)
    } 
    print b
}' file
servername,2017 08 07,SomeText1,SomeText2

【讨论】:

    【解决方案2】:

    您似乎想在. 之前提取字符串,直到遇到:;。如果逻辑是你想要的,那么你可以使用 grep 和 perl 来做到这一点,

    $ s="servername.domain:2017 08 07.SomeText1.otherIrrelevantStuff;SomeText2.MoreStuff"
    
    $ grep -oP '[0-9a-zA-Z\s]+(?=\.)' <<< "$s"
    servername
    2017 08 07
    SomeText1
    SomeText2
    

    简要说明,

    • (?=\.) :匹配点前面的单词
    • [0-9a-zA-Z\s]+grep 将打印这部分,匹配 0-9、A-Z、a-z 或空格的模式。

    【讨论】:

    • 在这种情况下,grep 的问题是它在不同的行上打印输出。输出应该是单行(文件的每一行),例如:servername 2017 08 07 SomeText1 SomeText2
    • 也许将输出流水线到tr -d '\n'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多