这就是我想做的事。我有一个文件,其中的行以多种方式分隔,我想根据这些行中的模式捕获多个子字符串。
所以示例行将是这样的:
servername.domain:2017 08 07.SomeText1.otherIrrelevantStuff;SomeText2.MoreStuff
^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^
换句话说,我想捕获" servername"," 2017 08 07"," SomeText1"和#34; SomeText2"在我的文件的每一行。
我尝试使用perl -P和正向前瞻/后面但只有第一个工作。每行的结果也应该打印成一行(因此通过几个grep -oP的管道是不可接受的)。
你会怎么做?
答案 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或空格的模式。