表达式 1 之后的表达式 2 的 grep 正则表达式模式

表达式 1 之后的表达式 2 的 grep 正则表达式模式

我试图找到一堆 HTML 文件中哪一个的标题带有“代理”一词,并且在该标题之后的任何位置都有特定代理的名称。

所以通常是这样的

<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

应该可以找到

但我不能保证标题和 XYZ Corp 实例之间的标记或内容有任何规律性。因此,在 DOS 之类的情况下,我可能会搜索“Agent*XYZ”的含义

-match the string 'Agent'
-followed by anything
-followed by the string 'XYZ'

我如何在 Ubuntu 上用 grep 编写它?我努力了

grep -lc 'Agent*XYZ' *.html
grep -lc 'Agent.*?XYZ' *.html

都没有成功。我可以在多个文件中手动找到该模式,因此我知道它存在。

TIA

答案1

这样的事情似乎对你的目标有好处:

$ cat d2.txt
<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

$ grep -i 'agent' d2.txt #-i = ignore case. By default grep returns lines containing agent followed by anything or even alone
<h3>Agent</h3>
<p>Their agent is XYZ Corp.</p>

$ grep -iE 'agent.*XYZ' d2.txt #match agent followed by XYZ
<p>Their agent is XYZ Corp.</p>

答案2

假设h3标题始终出现在与代理名称分开的行上,sed似乎能够满足您的要求。

给定输入文件

some data
at the top
<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>
some data
at the bottom

命令

sed -n '\#<h3>Agent</h3>#,/XYZ/p' input.html

将生成

<h3>Agent</h3>
<p>Blah blah blah </p>
<p>Their agent is XYZ Corp.</p>

sed命令将输出与两个正则表达式<h3>Agent</h3>XYZ(包含)匹配的行之间的任何内容。分隔第一个正则表达式的时髦外观\#...#就是如何使用自定义分隔符。我就是这样做的,而不是逃避/模式。

相关内容