简单的Grep不匹配问题

时间:2011-07-10 20:46:50

标签: regex linux bash command-line grep

我正在使用Ubuntu 10.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.movanother-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等问题。

非常感谢。

3 个答案:

答案 0 :(得分:3)

你想为grep使用Perl正则表达式 - 为什么不直接使用perl?

echo "$example" | perl -nle 'm/.*?video.php\?video=([^"]+)">.*video.php\?video=([^"]+)".*/; print "=$1=$2="'

将打印

=one-hd.mov=another-hd.mov=

答案 1 :(得分:1)

以下是使用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

$

答案 2 :(得分:1)

使用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-parser代替BeautifulSoup