только регулярное выражение "Группа 1" а не "полный матч" - PullRequest
2 голосов
/ 16 апреля 2019

Привет У меня есть следующее регулярное выражение , которое должно вернуть мне содержимое только , что находится между 9-й и 10-й вертикальной чертой (|)

^\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 ]

3 голосов
/ 16 апреля 2019

Вы используете не тот инструмент для работы.Это будет работать четко, просто, эффективно, переносимо и расширяемо с любым awk в любой оболочке на любом компьютере UNIX:

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

Каждый раз, когда вы вводите данные, которые разбиты на поля или требуют составных регулярных выражений, вам следует серьезнорассмотрите возможность использования awk вместо grep.

1 голос
/ 16 апреля 2019

Поскольку вы уже используете опцию -P, самое простое решение - обрезать совпадение после сопоставления текста до 9-го канала с помощью \K оператора сброса совпадения :

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

См. Демоверсию regex

A grep онлайн-демонстрация :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...