Regex для получения содержимого с разделителями с помощью egrep - PullRequest
2 голосов
/ 23 ноября 2011

Я хотел бы получить параметр (без паратезов) вызова функции с регулярным выражением.

Я использую egrep в скрипте bash с cygwin.что я получил так далеко (с парантезами):

$ echo "require(catch.me)" | egrep -o '\((.*?)\)'
(catch.me)

Какое здесь правильное выражение?

Ответы [ 3 ]

11 голосов
/ 24 ноября 2011

http://www.greenend.org.uk/rjk/2002/06/regexp.html

То, что вы ищете - это регулярные выражения с заглядыванием назад и с нетерпением.

Egrep не может этого сделать.grep с поддержкой perl может сделать это.

из man grep:

 -P, --perl-regexp
          Interpret PATTERN as a Perl regular expression.  This is highly experimental and grep -P may warn of unimplemented features.

Итак

$> echo "require(catch.me)" | grep -o -P '(?<=\().*?(?=\))'
catch.me
4 голосов
/ 23 ноября 2011

Если вы можете использовать sed, то будет работать следующее:

echo "require(catch.me)" | sed 's/.*[^(](\(.*\))/\1/'

Вы можете изменить существующее регулярное выражение на это

echo "require(catch.me)" | egrep -o 'c.*e'

Даже если egrep предлагает это (со страницы руководства)

-o, --only-matching
              Show only the part of a matching line that matches PATTERN.

Это не совсем правильная утилита.SED и AWK являются мастерами в этом.Вы будете иметь намного больше контроля, используя либо SED, либо AWK.:)

0 голосов
/ 23 ноября 2011

Из руководства:

   grep, egrep, fgrep - print lines matching a pattern

По сути, grep используется для печати всей строки, поэтому больше ничего делать не будет.

Для таких операций вам следует использовать другой инструмент, возможно, perl.

...