在每个匹配的字符串前查找每个字符

时间:2015-01-30 18:35:05

标签: regex bash notepad++

我正在绞尽脑汁试图找出如何制作正则表达式以找到我要找的东西。我想找到一个项目的每一个出现,然后找到与该项目一起的前一行的第一个字符串。以下是一个例子

.
<tag name="host-ip">192.168.5.4</tag>
.
[Poodle 12345]
.
<tag name="host-ip">192.168.5.75</tag>
.
[Poodle 12345]

每个点代表多行不相关的文本。我还需要搜索Poodle字符串,而不是IP。 IP首先列在xml文件中,然后主机容易受到Poodle的攻击,[Poodle 12345]会显示在报告中。我想要一个仅列出的IP列表,但是首先需要找到Poodle字符串,然后需要显示之前的随机IP。 (如下所示)

192.168.5.4
192.168.5.75
.
.
192.168.5.100

使用正则表达式在Notepad ++中执行此操作最简单,因为它是一个xml文件,但通过cmd行输出也可以。任何帮助将不胜感激,因为我不是一名注册专家。即使这是不可能的,任何能让我走上正轨的东西都会受到赞赏。谢谢!

2 个答案:

答案 0 :(得分:3)

鉴于您已展示的示例文字,我会写

awk -F'[<>]' '/tag name="host-ip"/ {ip=$3} /Poodle 12345/ {print ip}' file

另一种想到的方法是反转文件。然后,当您找到&#34; Poodle&#34;时,输出 next IP。

答案 1 :(得分:0)

在你的情况下,我会使用先行断言:寻找一个IP地址,后跟一些字符串,然后是[Poodle 12345]字符串。 这是正则表达式:

(\d{1,3}\.){3}\d{1,3}(?=<\/tag>[\na-z\."]*\n\[Poodle\s[\d]{5}\])

一些解释:

  • (\d{1,3}\.){3}\d{1,3} ip address;
  • (?= lookahead断言;
  • <\/tag>[\na-z\."]*\n\[Poodle\s[\d]{5}\]在IP地址之后我们期待的是什么。

您可以在此处进行测试:https://regex101.com/r/gT0zO3/2