2016-11-03 14 views
0

我需要使用Perl兼容正则表达式来匹配出现在文件中多行的多个字符串。PCRE正则表达式 - 如何返回匹配多行字符串以任意顺序查找多个字符串

这些匹配需要以任何顺序出现(服务器servernameA.company.com后跟servernameZ.company.com,后跟servernameD.company.com或三者的任意顺序组合)。 注意:所有匹配将出现在每行的开头。

在我与grep -P测试,我还没有能够生产(使用的/s/m修饰符即使)出现在了新生产线的任何命令简单的字符串项匹配。我很肯定从阅读中我需要一个前瞻断言,但即使在分析正则表达式的每一位以确保它与我的场景相关之后,我使用的示例并没有为我生成匹配。

因为我需要在生产中支持这个,所以我想要一个简单而相对直接的解释。

采样输入

irrelevant_directive = 0 

# Comment 
server servernameA.company.com iburst 

additional_directive = yes 

server servernameZ.company.com iburst 
server servernameD.company.com iburst 

# Additional Comment 
final_directive = true 

期望

正则表达式应该匹配,并返回3号线与服务器开始(即按任何顺序出现),当且仅当是绝配对于strings'serverA.company.com','serverZ.company.com'和'serverD.company.com',随后是iburst。所有3个字符串必须包含在内。

最后,如果答案(或答案的一个非常相似的形式)可以解决以单行行的任何顺序检查字符串,那将是非常有用的。例如,如果我有一个单行字符串:preauth param audit=true silent deny=5 severe=false unlock_time=1000 time=20ms,并且我想确保条款deny=5time=20ms以任何顺序出现,并且如果匹配。

非常感谢您的帮助。

+0

你是在谈论PCRE还是关于Perl程序? – simbabque

+0

感谢您的快速反应,并看着这个。 PCRE具体。我将使用'grep -P'命令。请刷新,因为我添加了一个新的关于预先输出的正则表达式,这是我之前忽略的。 –

+0

然后请不要用Perl标记。我将删除标签。有一个完整的程序解决这个问题,但在一个正则表达式中这样做会很困难。 – simbabque

回答

1

关于主要问题[用于二次问题看到Casimir et Hippolyte answer](使用x改性剂):https://regex101.com/r/mkxcap/5

(?: 
    (?<a>.*serverA\.company\.com\s+iburst.*) 
|(?<z>.*serverZ\.company\.com\s+iburst.*) 
|(?<d>.*serverD\.company\.com\s+iburst.*) 
|[^\n]*(?:\n|$) 
)++ 
(?(a)(?(z)(?(d)(*ACCEPT))))(*SKIP)(*F) 

这些匹配现在都在a,zd捕获组中。

这不是最有效率的(它在每一行上都有三次回溯......),但主要的要点是注册与捕获组的匹配,然后检查它们是否被定义。

1

你并不需要使用PCRE功能,你可以简单地写在ERE:

grep -E '.*(\bdeny=5\b.*\btime=20ms\b|\btime=20ms\b.*\bdeny=5\b).*' file 

的PCRE方法会有所不同:(但你也可以使用以前的模式)

grep -P '^(?=.*\bdeny=5\b).*\btime=20ms\b.*' file 
+0

嗨Casimir!这实际上是我回答你的第二个问题。谢谢你,这是有帮助的,但你有办法解决主要问题(多线)?对不起,如果我让事情比必要的更混乱。单线正则表达式是一个奖金,我现在正在测试它! –

+0

嗨Casimir,我证实你的解决方案,单线问题完美的作品!谢谢。当你有机会时,你能看看我的主要问题吗?将二者合二为一的道歉 - 我将来不会那样做。 –

+0

Upvoted,因为这是有帮助的。 bwoebi解决了我的主要问题。感谢您的时间! –

相关问题