![正则表达式搜索适用于“grep -E”,但不适用于 bash 脚本?](https://linux22.com/image/1045705/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%90%9C%E7%B4%A2%E9%80%82%E7%94%A8%E4%BA%8E%E2%80%9Cgrep%20-E%E2%80%9D%EF%BC%8C%E4%BD%86%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%20bash%20%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我使用相同的正则表达式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 中的单引号和双引号。