我使用此命令行从包含各种其他标记、链接等的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/