逻辑上不可能获取这个特定的字符串。?

时间:2014-03-05 03:58:48

标签: sql string shell awk logic

我有3个随机的字符串,看起来有点像

1) ENTL.COMPENSATION REM      REVERSE PAYMENT COUPON ON ISIN //IT0004889033  IN A TRIPARTY //TRANSACTION WITH 95724
2) 01P ISIN DE000A1H36U5 QTY 44527000, //C/P 19696
3) COUPON ISIN XS0820547742 QTY 466750,

现在需要的是获取值 IT0004889033 DE000A1H36U5 XS0820547742 。如果你观察到3个字符串,这3个预期值在ISIN之后就会出现。所以我们可以将isin作为参考,然后在ISIN之后获取值。但这似乎并非所需。我们不应该通过取一些值作为参考来获取值。

由于期望值为 IT0004889033 ,这是一个12位数的字符,我所拥有的信息是;前2个字符是字母,其次9个是字母数字,最后一个是数字。只需使用此信息,就可以进行通配符搜索或获取此12位数值。

我在这个逻辑上完全迷失了。

2 个答案:

答案 0 :(得分:3)

您提到 ISIN 不应用作参考。因此,唯一可以肯定的是,要找到的字符串以2个字母开头,后跟9个字母和/或数字,并以数字结尾。

我将您的示例文本保存为 tmp ,并运行以下 egrep 命令...似乎对我有用:

jim@debian:~/tmp$ egrep -o "[a-zA-Z]{2}[a-zA-Z0-9]{9}[0-9]{1}" tmp
IT0004889033
DE000A1H36U5
XS0820547742

上述解决方案比以前的解决方案更正确,因为它需要一定数量的字符来过滤结果。上述代码只返回12个字符的字符串。

我希望这有帮助!

答案 1 :(得分:2)

使用grep -oP

grep -oP 'ISIN\W+\K\w+' file
IT0004889033
DE000A1H36U5
XS0820547742

如果grep -P不可用,那么您可以使用awk:

awk -F '.*ISIN[^0-9a-zA-Z]*| ' '{print $2}' file
IT0004889033
DE000A1H36U5
XS0820547742

或者其他:

awk -F '.*ISIN[^[:alnum:]]*| ' '{print $2}' file