如何使用bash提取字符串中所有符合指定模式的字符序列
解决方案
问题原因
原有脚本无法适配多匹配场景有两个核心原因:
- 正则开头的
.*是贪婪匹配规则,会吞掉字符串开头到最后一个匹配项之间的所有内容,仅能捕获到最后一个符合规则的串 - Bash原生的
=~正则匹配单次执行仅返回一组匹配结果,原生不支持直接返回全量匹配项
方案1:使用GNU grep实现(最简方案)
一行即可完成需求,适配绝大多数Linux环境:
input='Some random prefix "characters inside quotes first".fixed() some random postfix, some random post prefix "characters inside quotes second".fixed() some random post postfix.' grep -oP '(?<=")[^"]*(?="\.fixed\(\))' <<< "$input"
参数说明:-P启用Perl正则语法支持环视规则,-o仅输出匹配到的内容,正则通过前后环视直接定位双引号内部的目标内容,无需额外处理分组。
方案2:纯Bash实现(无外部依赖)
如果不能依赖grep等外部工具,可以用循环逐次匹配截断的方式实现:
input='Some random prefix "characters inside quotes first".fixed() some random postfix, some random post prefix "characters inside quotes second".fixed() some random post postfix.' pattern='"([^"]+)"\.fixed\(\)' rest="$input" while [[ $rest =~ $pattern ]]; do echo "${BASH_REMATCH[1]}" # 截断已处理的匹配段,继续匹配剩余字符串 rest=${rest#*"${BASH_REMATCH[0]}"} done
该方案兼容性更强,适用于所有支持=~正则匹配的Bash版本。
内容的提问来源于stack exchange,提问作者div
相关产品推荐
相关产品推荐

