我试图找到一堆 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
(包含)匹配的行之间的任何内容。分隔第一个正则表达式的时髦外观\#...#
就是如何使用自定义分隔符。我就是这样做的,而不是逃避/
模式。