我使用此命令行从包含各种其他标记、链接等的HTML文件中获取特定行:

cat index.html | grep -m1 -oE '<a href="(.*?)" rel="sample"[\S\s]*.*</dd>'

它输出我想要的线:
<a href="http://example.com/something/one/" rel="sample" >Foo</a> <a href="http://example.com/something/two/" rel="sample" >Bar</a></dd>

但我只想捕获something/two(最后一个url的路径),考虑到:
url事先不知道(它是处理多个html文件的脚本)
该行有时只能包含一个url,例如。
<a href="http://example.com/something/one/" rel="sample" >Foo</a></dd>

在这种情况下,我只想得到something/one,因为在这种情况下,它是最后一个。
我该怎么做?

最佳答案

如果您可以使用perl,那么在regex中捕获将使这一点变得更加容易。

 perl -ne 'm(.*<a href="[^:]+://[^/]*/(.*?)" rel="sample".*</dd>) and print "$1\n";'

regex与grep基本相同。我使用了m()而不是//来避免逃逸regex中的/
初始值.*将贪婪地捕获行开头的所有内容。如果一行有多个链接,它将捕获除最后一个链接以外的所有链接。这也适用于grep,但它会导致grep-o输出行的开头,因为这现在与regex匹配。
这与捕获括号无关,因为只有(.*?)中的部分被捕获并打印。
它的使用方法与grep相同。
cat index.html | perl -ne 'm(.*<a href="[^:]+://[^/]*/(.*?)" rel="sample".*</dd>) and print "$1\n";'

or

perl -ne 'm(.*<a href="[^:]+://[^/]*/(.*?)" rel="sample".*</dd>) and print "$1\n";' index.html

关于regex - 如何匹配单行字符串上最后出现的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43565725/

10-15 05:24