PCRE - Первый матч - PullRequest
       20

PCRE - Первый матч

0 голосов
/ 10 марта 2012

Я использую grep для извлечения частей из файла, но у меня возникают проблемы с его корректной работой.Из строки

something0( something1

Я хочу извлечь что-то0.Это отлично работает на некоторых входных данных,

echo 'a b( c d' | grep -Po '(?m)^.+?(?=\(.+)'   #outputs 'a b'

Но не очень хорошо на других входных данных,

echo 'a b( )c d( e f' | grep -Po '(?m)^.+?(?=\(.+)'   #outputs 'a b' and '( ) c d'

Как я могу заставить grep возвращать только первое совпадение или улучшать мое регулярное выражение?Передача вывода greps в

head -n 1

не является альтернативой, поскольку grep будет читать весь файл с этими строками, и если я не ошибаюсь в этом, он выведет только первое совпадение в файле.Ладно предположить, что что-то 0 не содержит никаких '('.

Спасибо.

-P

Ответы [ 3 ]

0 голосов
/ 10 марта 2012

Попробуйте с помощью следующего регулярного выражения. Также работает:

$ echo 'a b( c d' | grep -Po '^([^(]*)'
a b
$ echo 'a b( )c d( e f' | grep -Po '^([^(]*)'
a b
0 голосов
/ 10 марта 2012

А как насчет того, что вы хотите?

^[^(]*?(?=\()
0 голосов
/ 10 марта 2012

Э-э, вы уверены?

$ echo 'a b( )c d( e f' | grep -Po '(?m)^.+?(?=\(.+)'
a b

(Также обратите внимание, что последний + не нужен; регулярное выражение эквивалентно более короткому (?m)^.+?(?=\(.).

...