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

如何在Bash中用正则表达式提取字符串中的所有指定匹配项

解决Bash中提取特定模式字符串的问题

你的sed命令失败的原因有两个:

  1. .*是贪婪匹配,会尽可能匹配最多的字符,导致最后一个匹配项PER-10中,[A-Z]+只捕获到了R(前面的PE被.*吃掉了);
  2. sed默认只执行一次替换操作,只会输出最后一个匹配的部分。

以下是几种可行的解决方案:

方法一:使用grep的-o选项(最简单)

grep的-o参数会只输出匹配正则表达式的部分,配合-E启用扩展正则,直接提取所有符合[A-Z]+-[0-9]+模式的字符串:

echo "PA-232 message1 GX-1234 message2 PER-10 message3" | grep -Eo '[A-Z]+-[0-9]+'

执行后输出:

PA-232
GX-1234
PER-10

方法二:使用sed循环替换

通过sed的全局替换和清理操作,保留所有匹配项并换行输出:

echo "PA-232 message1 GX-1234 message2 PER-10 message3" | sed -E 's/([A-Z]+-[0-9]+)/\n\1\n/g; s/[^[:alnum:]-]*\n/\n/g; s/^\n|\n$//g'

步骤说明:

  • 先给每个匹配项前后添加换行符,将匹配项与其他内容分隔开;
  • 清除所有非匹配内容(包含换行的无效内容);
  • 去掉首尾多余的换行符。

方法三:使用awk遍历字段

按空格分割字符串,遍历每个字段并筛选符合模式的内容:

echo "PA-232 message1 GX-1234 message2 PER-10 message3" | awk '{for(i=1;i<=NF;i++) if($i ~ /^[A-Z]+-[0-9]+$/) print $i}'

说明:NF代表当前行的字段总数,逐个检查每个字段是否匹配目标模式,匹配则打印。

内容的提问来源于stack exchange,提问作者codependent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:55:22