You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 02:13:10