regex - 正则表达式仅匹配“第 1 组”。而不是“完全匹配”
问题描述
嗨,我有以下正则表达式,它应该只返回第 9 条和第 10条竖线(|)之间的内容
^\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
?
解决方案
您为这项工作使用了错误的工具。这将在任何 UNIX 机器上的任何 shell 中的任何 awk 上清晰、简单、高效、可移植和可扩展地工作:
$ awk -F'[|]' '/^[0-9]*,MSH/{print $10}' file
78455-874-6875
任何时候您的输入被分解为字段或需要复合正则表达式,您都应该认真考虑使用 awk 而不是 grep。
推荐阅读
- algorithm - 在具有邻接列表(数据结构)的图中查找循环
- python - Python - 过滤 BS4 内容
- php - 在 Laravel 中使用未定义的常量“lte”错误
- mysql - SQLSTATE [23000]:违反完整性约束:4025 CONSTRAINT
- docker - 使用 GitLab CI 构建 Singularity 容器
- c++ - CUDA 内核是否需要将 const 放入所有按值传递的参数中?
- python - Tweepy 没有获取所有的推文
- java - Ravendb 按值查询顺序
- css - 如何通过 CSS 设置更改 Blazor 中的文本颜色
- react-native - 使用 react-native 和 styled-components 如何更改子道具?