首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将正则表达式应用于bash中的字符串,以获取组的所有ocurrence。

将正则表达式应用于bash中的字符串,以获取组的所有ocurrence。
EN

Stack Overflow用户
提问于 2022-09-18 20:22:25
回答 2查看 31关注 0票数 1

我有一个shell变量,其字符串如下:"PA-232 message1 GX-1234 message2 /-10 message3“

我需要应用一个正则表达式来检测PA-232,GX-1234和每-10,并返回这些表达式。

我怎么能在巴什做到这一点?

我试过这个:

代码语言:javascript
复制
echo "PA-232 message1 GX-1234 message2 PER-10 message3" | sed -r 's/^.*([A-Z]+-[0-9]+).*$/\1/'

但它又回来了

R-10

而不是

代码语言:javascript
复制
PA-232
GX-1234
PER-10
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-18 20:27:53

代码语言:javascript
复制
$ echo "PA-232 message1 GX-1234 message2 PER-10 message3" | grep -Eo '[A-Z]+-[0-9]+'
PA-232
GX-1234
PER-10
票数 2
EN

Stack Overflow用户

发布于 2022-09-18 20:32:47

Perl:

代码语言:javascript
复制
$ echo "PA-232 message1 GX-1234 message2 PER-10 message3" | perl -lnE 'while(/([A-Z]+-\d+)/g){ say $1 }'

awk

代码语言:javascript
复制
$ echo "PA-232 message1 GX-1234 message2 PER-10 message3" | awk '{for(i=1;i<=NF;i++) if($i~"^[A-Z]+-[[:digit:]]+$") print $i}'

或纯Bash正则表达式+循环:

代码语言:javascript
复制
str="PA-232 message1 GX-1234 message2 PER-10 message3" 

while [[ $str =~ ([^A-Z]*)([A-Z]+-[[:digit:]]+)([  \t]+|$) ]]; do
    echo "${BASH_REMATCH[2]}"       # the field
    i=${#BASH_REMATCH}              # length of field + not the field on both sides
    str=${str:i}                    # advance the string by that length
done                                # the loop deletes $str, so make a copy if needed

任何这些指纹:

代码语言:javascript
复制
PA-232
GX-1234
PER-10
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73766155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档