在同一行捕获多个正则表达式模式

时间:2017-08-10 19:30:08

标签: regex linux awk sed grep

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

所以示例行将是这样的:

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

换句话说,我想捕获" servername"," 2017 08 07"," SomeText1"和#34; SomeText2"在我的文件的每一行。

我尝试使用perl -P和正向前瞻/后面但只有第一个工作。每行的结果也应该打印成一行(因此通过几个grep -oP的管道是不可接受的)。

你会怎么做?

2 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

似乎您希望在.之前提取字符串,直到满足:;为止。如果逻辑符合您的要求,那么您可以使用perl grep来执行此操作,

$ 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或空格的模式。