如何获取字符串的最后 2 个字符,最后一个字符是 A 或 B,最后一个字符的第二个是 1-360?(正则表达式 GREP)

How to get the last 2 characters of a string with last character being A or B and second to the last character being 1-360? (REGEX GREP)

提问人:x2ffer12 提问时间:12/14/2022 最后编辑:brian d foyx2ffer12 更新时间:12/15/2022 访问量:121

问:

我并不是每天都在使用正则表达式,而且我对此仍然很陌生。

例如,我有这些字符串,这是字符串的格式:

APPLE20B50A
APPLE30A 60B APPLE12B 5B APPLE360A360B 苹果56B


基本上,我想得到最后一个字母(A或B)和最后一个字母之前的数字(或字母后面的数字/数字之前的数字,也是A或B)。还有一种格式,如APPLE56B,中间没有数字+字母。

预期输出

50A
60B
5B
360B
56B

我试过了,但它只输出最后 2 个字符:grep -o '.\{2\}$'

0A
0B
5B
0B
6B

显然,数字不是动态的。任何帮助将不胜感激。

与正则表达式 语言无关

评论


答:

2赞 Dan Bonachea 12/14/2022 #1

试试这个:

cat input-file | perl -ne 'print "$1\n" if (m/([0-9]+[AB])$/)'
3赞 ikegami 12/14/2022 #2

grep -o确实可以使用正确的模式

grep -oP '[0-9]+[AB]$'

使用 Perl,

perl -nle'print $& if /[0-9]+[AB]$/'
perl -nle'print for /([0-9]+[AB])$/'

在所有情况下,您都可以通过 STDIN 或通过将文件名作为参数传递来提供输入。

1赞 potong 12/14/2022 #3

这可能对你有用 (GNU grep):

grep -o '\(360\|3[0-5][0-9]\|[1-2][0-9][0-9]\|[1-9][0-9]\|[1-9]\)[AB]\>' file

这将在单独的行上打印每个值,从 到 。1A/1B360A/360B

若要用空隔开这些值,请使用:

grep -o '\(360\|3[0-5][0-9]\|[1-2][0-9][0-9]\|[1-9][0-9]\|[1-9]\)[AB]\>' file |
paste -sd' '