您好,我有以下regex,应该向我返回仅的内容,该内容介于第9n和第10n 竖线(|)之间
^\d*,MSH(?:[^|]*\|){9}([^|]*)
当我将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
?
答案 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
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