我正在使用Ubuntu10.10和使用Grep处理一些HTML文件。
下面是HTML片段:
<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">我想提取one-hd.mov和another-hd.mov,但忽略normal.mov。
这是我的代码:
example='<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">'
echo $example | grep -Po '(?<=video.php\?video=).*?(?=-hd.mov">)'结果是:
one
normal.mov"><img src="/2.jpg"><a href="video.php?video=another但我想
one
another那里有错配。
这是因为所谓的贪婪正则表达式吗?
我正在唱GREP,但是欢迎任何命令行bash工具来解决这个问题,比如sed等等。
非常感谢。
发布于 2011-07-10 21:06:27
您希望对grep使用perl -为什么不直接使用Perl呢?
echo "$example" | perl -nle 'm/.*?video.php\?video=([^"]+)">.*video.php\?video=([^"]+)".*/; print "=$1=$2="'将打印
=one-hd.mov=another-hd.mov=发布于 2011-07-10 21:10:13
下面是使用xmlstarlet的解决方案:
$ example='<a href="video.php?video=one-hd.mov"><img src="/1.jpg"><a href="video.php?video=normal.mov"><img src="/2.jpg"><a href="video.php?video=another-hd.mov">'
$ echo $example | xmlstarlet fo -R 2>/dev/null | xmlstarlet sel -t -m "//*[substring(@href, string-length(@href) - 6, 7) = '-hd.mov']" -v 'substring(@href,17, string-length(@href) - 17 - 3)' -n
one-hd
another-hd
$发布于 2011-07-10 21:18:12
使用awk的解决方案:
{
for(i=1;i<NF;i++) {
if ($i ~ /mov/) {
if ($i !~ /normal/){
sub(/^.*=/, "", $i)
print $i
}
}
}
}产出:
$ awk -F'"' -f h.awk html
one-hd.mov
another-hd.mov但是,我强烈建议您使用html解析器来代替,类似于BeautifulSoup。
https://stackoverflow.com/questions/6643565
复制相似问题