Bash脚本中正则表达式匹配失败问题求助
Bash正则匹配问题解决
问题场景
从zip文件中提取出如下字符串:
866275 2016-02-06 11:25 Documents/familystuff/Household/Agri Stuff/Sheep/sheep Photos/2014 ewe lambs/074Cleo 6Feb16a.jpg
需要提取第一个数字字段(文件大小)和最后的文件路径。在线正则测试工具中,以下正则能正常匹配:
(^[0-9]+)" "[0-9]{4}-[0-9]{2}-[0-9]{2}" "[0-9]{2}:[0-9]{2}" "(.+)
但将其放入Bash脚本中执行时无输出,脚本代码如下:
if [[ $x =~ (^[0-9]+)" "[0-9]{4}-[0-9]{2}-[0-9]{2}" "[0-9]{2}:[0-9]{2}" "(.+) ]]; then echo bash0 Captured : ${BASH_REMATCH[0]} echo bash1 Captured number: ${BASH_REMATCH[1]} echo bash2 Captured NAME: ${BASH_REMATCH[2]} fi
仅保留(^[0-9]+)部分时能匹配到数字,添加其余部分后就无输出。
问题原因
Bash的=~正则匹配语法里,不需要用双引号" "来表示空格,你原来的写法里,引号会被当作正则表达式的一部分去匹配,而不是用来分隔空格。这就导致正则试图匹配带引号的空格,和目标字符串里的普通空格不匹配,所以整体匹配失败。
解决方法
把正则里的" "替换成直接的空格,去掉所有包裹空格的引号,修改后的脚本如下:
if [[ $x =~ ^([0-9]+) [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} (.+) ]]; then echo bash0 Captured : ${BASH_REMATCH[0]} echo bash1 Captured number: ${BASH_REMATCH[1]} echo bash2 Captured NAME: ${BASH_REMATCH[2]} fi
另外,开头的^可以放在第一个捕获组外面,不影响匹配结果,同时让正则结构更清晰。测试后,这个脚本就能正确提取出文件大小和路径了。
内容的提问来源于stack exchange,提问作者grolma
相关产品推荐
相关产品推荐

