2012-09-24 47 views
4

可能重複:
extract regexp result from string and write it to a variable如何使用grep來提取子字符串?

這裏是我的命令:

的grep -E「\ * [[:空間:]] + FIN [[:空間:]] +([^)] +?)')myfile

它輸出:

  • FIN(SUCCESS)

而且我想它只是輸出:

成功

我怎麼能告訴grep辦呢?

+0

用普通的'grep',你不行。如果你有這個(有點具有挑戰性)或者切換到'sed'或'awk'或Perl或Python,那麼使用grep -P。 – tripleee

回答

4

您可以將grep命令的輸出傳遞給awk命令。

grep -E '*[[:space:]]+FIN[[:space:]]+([^)]+?)') myfile | awk '{print $2}' 

我不確定如何單獨使用grep來做到這一點,因爲它並不是真的爲特定的用例量身定做的。既然你是在一個grep平臺上,那麼當你有一個命令解決問題的一部分時,使用管道是你的優勢,另一個命令則是另一個命令的另一部分。

+1

這是Grep無用的用法; 'awk'對正則表達式有本地和非常地道的支持。 – tripleee

+0

非常真實。通過簡單地添加額外的管道,讓OP成爲他想要的答案也更容易。可以辯論哪種方法來回答這個問題更好,我完全同意告訴OP只使用awk也是一個有效的答案。 – xshoppyx

+0

所以爲了完整性'awk'/ \ * [[:space:]] + FIN [[:space:]] +([^)] +)/'{print $ 2}'myfile'。 'awk'不支持'+?',但是'grep -E'實際上都不支持,是嗎?所有答案中都應引用星號。 – tripleee

3

grep不能輸出單個捕獲組,但您可以使用sed做到這一點,而不是:

sed 's/\*[[:space:]]\+FIN[[:space:]]\+(\([^)]\+\))/\1/g' file 
2

如果使用ack,那麼你可以使用匹配團體和--output開關:

ack '\*\s+FIN\((.+?)\)' --output='$1' myfile 
相關問題