2012-03-10 3 views
0

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

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 возвращают только первый матч или улучшить мое регулярное выражение? Трубопроводные отбирает выход к,

head -n 1 

не является альтернативой, так как Grep будет читать весь файл с этих строк, и если я не misstaking это будет выводить только первый матч в этом файле. Это ОКЕЙ предположить, что something0 не содержит каких-либо '('.

Спасибо.

-P

ответ

0

Как насчет соответствия именно того, что вы хотите?

^[^(]*?(?=\() 
+0

Спасибо. Я понимаю, что вопрос был тривиальным, но регулярное выражение для меня довольно новое. –

+0

@MLP Np m8. Рад помочь. – FailedDev

0

Er, вы уверены?

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

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

+0

Да, я уверен. Выходные данные - 'a b' и '() c d'. Спасибо, что указали лишнее «+». –

0

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

$ echo 'a b(c d' | grep -Po '^([^(]*)' 
a b 
$ echo 'a b()c d(e f' | grep -Po '^([^(]*)' 
a b 
Смежные вопросы