我有一个shell变量,其字符串如下:"PA-232 message1 GX-1234 message2 /-10 message3“
我需要应用一个正则表达式来检测PA-232,GX-1234和每-10,并返回这些表达式。
我怎么能在巴什做到这一点?
我试过这个:
echo "PA-232 message1 GX-1234 message2 PER-10 message3" | sed -r 's/^.*([A-Z]+-[0-9]+).*$/\1/'但它又回来了
R-10
而不是
PA-232
GX-1234
PER-10发布于 2022-09-18 20:27:53
$ echo "PA-232 message1 GX-1234 message2 PER-10 message3" | grep -Eo '[A-Z]+-[0-9]+'
PA-232
GX-1234
PER-10发布于 2022-09-18 20:32:47
Perl:
$ echo "PA-232 message1 GX-1234 message2 PER-10 message3" | perl -lnE 'while(/([A-Z]+-\d+)/g){ say $1 }'或awk
$ 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正则表达式+循环:
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任何这些指纹:
PA-232
GX-1234
PER-10https://stackoverflow.com/questions/73766155
复制相似问题