如何在Bash中用正则表达式提取字符串中的所有指定匹配项
解决Bash中提取特定模式字符串的问题
你的sed命令失败的原因有两个:
.*是贪婪匹配,会尽可能匹配最多的字符,导致最后一个匹配项PER-10中,[A-Z]+只捕获到了R(前面的PE被.*吃掉了);- 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
相关产品推荐
相关产品推荐

