2011-11-23 56 views
2

我想用正則表達式獲取函數調用的參數(不含parantheses)。正則表達式以egrep獲取分隔內容

我在使用cygwin的bash腳本中使用egrep

這是我走到這一步(帶括號):

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

什麼是正確的正則表達式嗎?

回答

10

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 
+0

謝謝!但這不夠嗎? (刪除?之後。*)'echo「require(catch.me)」| grep -o -P'(?<= \()。*(?= \))'' – Matthias

+0

在這種情況下 - 是的。但這取決於你的問題的背景。 '?' - 用於非貪婪的正則表達式。 –

0

從手冊:

grep, egrep, fgrep - print lines matching a pattern 

基本上,grep的用於打印的完整產品線,這樣你就不會做任何事情更多。

你應該做的是使用另一個工具,也許perl,這樣的操作。

+0

OP使用-o標誌,打印只有一行的匹配部分。 – eaj

4

如果您可以使用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

只是爲了標記這個; greps不打印捕獲組,它們打印整個匹配。我不知道如何告訴grep這樣做。我通常會破壞另一個工具。 – AlG

+0

@AIG:'grep -o'專門只打印捕獲組!這是一個非常隱蔽的功能。 – smci