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

标签 regex linux awk sed grep

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

因此示例行将如下所示:

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

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

我尝试使用 perl -P 和积极的前向/后向执行此操作,但只有第一个有效。每行的结果也应该打印在一行中(因此通过多个 grep -oP 进行管道传输是 Not Acceptable )。

你会怎么做?

最佳答案

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

$ 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

关于regex - 在同一行捕获多个正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622092/

相关文章:

c - 加速Linux可执行程序-arm处理器。位切换

linux - 如何找出谁在调用 apt-get?

regex - gawk 匹配函数参数作为正则表达式

linux - 如何使用awk打印路径文件名的尾部

linux - 加入两个文件,包括 Shell 中不匹配的行

javascript - js : special char in regex

php - 正则表达式替换 PHP 中的 html src 属性

javascript - 使用 SSN 正则表达式、屏蔽输入和依赖的 Jquery 验证

linux - 如何在linux中运行.cc扩展名的文件?

正则表达式 (grep) 向后匹配