正则表达式仅匹配“组1”。而不是“完全匹配”

时间:2019-04-16 14:35:10

标签: regex grep

您好,我有以下regex应该向我返回的内容,该内容介于第9n和第10n 竖线(|)之间

^\d*,MSH(?:[^|]*\|){9}([^|]*)

但是它返回我“组1”。和“完全匹配”: enter image description here

当我将linux grep与正则表达式grep -P '^\d*,MSH(?:[^|]*\|){9}([^|]*)' export.csv一起使用时 它选择“完全匹配”:

16037,MSH|^~\&|SENDAPP|SENDFAC|RECVAPP|RECVFAC|1||ORU^R01|78455-874-6875|P|2.3|||AL

如何制作grep 以仅打印Group 1. 78455-874-6875

2 个答案:

答案 0 :(得分:3)

您使用的工具错误。在任何UNIX机器上的任何shell中的任何awk上,它都可以清晰,简单,高效,可移植和可扩展地工作:

$ awk -F'[|]' '/^[0-9]*,MSH/{print $10}' file
78455-874-6875

每当您将输入分为多个字段或需要复合正则表达式时,都应该认真考虑使用awk而不是grep。

答案 1 :(得分:1)

由于您已经在使用-P选项,所以最简单的解决方案是使用\K match reset operator将文本匹配到第9个管道之后,截断匹配项:

grep -oP '^\d*,MSH(?:[^|]*\|){9}\K[^|]*' file
                                ^^  

请参见regex demo

一个grep online demo

s='16037,MSH|^~\&|SENDAPP|SENDFAC|RECVAPP|RECVFAC|1||ORU^R01|78455-874-6875|P|2.3|||AL'
grep -oP '^\d*,MSH(?:[^|]*\|){9}\K[^|]*'  <<< "$s"
# => 78455-874-6875