正在文件中搜索被其他两个已知字符串包围的字符串?

正在文件中搜索被其他两个已知字符串包围的字符串?

问题标题可能有点模糊,但这就是我想要做的。

我的服务器本地有一个 html 文件,该文件经常更改。它多次出现:

<p>Jumble of random text</p>
<p>More text</p>

等等...

我希望能够对所有不同的随机文本进行排序,直到找到我正在寻找的文本,例如“随机”,它可能位于文件中的任何位置。然后我想要一个变量分配给

Jumble of random text

之间的一切:

<p> and </p>

到目前为止我有这个:

echo grep -i 'random' search.html | grep -o -P '(?<=<p>).*(?=</p>)' search.html

这在一定程度上有效,但是它正在查找段落标签的第一次出现和最后一次出现,因此给了我大量无意义数据的输出,即在这种情况下:

Jumble of random text
More text

我怎样才能让它返回:

Jumble of random text

变得非常困惑,速度非常快。

答案1

这是因为匹配模式.*就是所谓的贪心匹配,这意味着它将返回最大的字符串以匹配您的搜索模式。

你想要做的是使用非贪婪(或者懒惰的) 匹配,返回最短字符串来匹配您的模式。您可以通过将贪婪匹配从 更改为 来做到这.*一点.*?。但是,grep默认情况下通常不支持此功能,但您可以通过使用-P允许类似 perl 正则表达式匹配的选项来启用此功能。

简而言之,您可以将 grep 命令更改为grep -o -P '(?<=<p>).*?(?=</p>)'.

有关此答案的更多详细信息,请访问https://stackoverflow.com/questions/3027518/non-greedy-grep

相关内容