问题标题可能有点模糊,但这就是我想要做的。
我的服务器本地有一个 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