我有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位数值。
我在这个逻辑上完全迷失了。
答案 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