首页 > 解决方案 > 正则表达式仅匹配“第 1 组”。而不是“完全匹配”

问题描述

嗨,我有以下正则表达式,它应该返回第 9 条和第 10条竖线(|)之间的内容

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

但它返回给我“第 1 组”。和“完全匹配”: 在此处输入图像描述

当我将 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

标签: regexgrep

解决方案


您为这项工作使用了错误的工具。这将在任何 UNIX 机器上的任何 shell 中的任何 awk 上清晰、简单、高效、可移植和可扩展地工作:

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

任何时候您的输入被分解为字段或需要复合正则表达式,您都应该认真考虑使用 awk 而不是 grep。


推荐阅读