正则表达式搜索适用于“grep -E”,但不适用于 bash 脚本?

正则表达式搜索适用于“grep -E”,但不适用于 bash 脚本?

我使用相同的正则表达式grep并且它给出了匹配结果,但是在 bash 脚本中执行时,它不返回匹配结果。

测试字符串(文件的一部分testregex.txt):

<a href="/os_x_lynx-wallpapers.html"><p>OS X Lynx</p><img src="/thumbs/os_x_lynx-t1.jpg"alt="OS X Lynx" class="thumb_img" width="270" height="169"/></a></div><div style="float:right;margin-right:13px;"></div></div>

此命令正确匹配突出显示的部分(以及其他一些部分):

grep -E '<img src="[^"]*\.jpg"' testregex.txt

但是这个 bash 脚本没有返回任何匹配项:

page=$(<testregex.txt)

if [[ $page =~ '<img src="[^"]*\.jpg"' ]]; then
    echo $1
    echo "match found"
else
    echo "match not found!"
fi

答案1

在 case=~运算符中,不要对右侧运算符使用引号。这被视为扩展正则表达式,因此在这种情况下,单引号将成为正则表达式的一部分。因此,使用单引号,'<img src="/thumbs/os_x_lynx-t1.jpg"'将找到类似 ( 也包含单引号 ) 的字符串。请参阅shell 脚本中“=~”运算符的含义

另外,你必须转义正则表达式中的任何特殊字符(引号,空格,shell 重定向 - <):

#!/bin/bash
page=$(<testregex.txt)

if [[ $page =~ \<img\ src=\"[^\"]*\.jpg\" ]]; then
    echo $1
    echo "match found"
else
    echo "match not found!"
fi

除此之外=~,您还可以在脚本中使用原始命令,该命令使用grep

#!/bin/bash

if grep -qE '<img src="[^"]*\.jpg"' testregex.txt ; then
    echo $1
    echo "match found"
else
    echo "match not found!"
fi

在这种情况下,我使用-q选项grep不将任何内容写入标准输出,并且如果发现任何匹配则立即退出。

答案2

如果你写[[ "$page" =~ '<img src="[^"]*\.jpg"' ]],那么右侧将被视为普通字符串,而不是正则表达式。请参阅Bash 正则表达式语句. 解决办法是逃避所有的特殊字符

否则,您可以在单引号内的单独变量中使用正则表达式语句,''例如,

var='<img src="[^"]*\.jpg'

在这种情况下,您不需要逐个转义特殊字符。

#!/bin/bash
page=$(<testregex.txt)
var='<img src="[^"]*\.jpg'

if [[ "$page" =~ $var ]]; then
#    echo $1
    echo "match found"
else
    echo "match not found!"
fi

我已经评论了这echo $1句话。Bash 中的单引号和双引号

相关内容