2016-11-07 73 views
0

我有很多行的輸入流看起來像這樣提取的正則表達式模式:桑達:從線

path/to/file:    example: 'extract_me.proto' 
path/to/other-file:    example: 'me_too.proto' 
path/to/something/else:    example: 'and_me_2.proto' 
... 

我想只是提取這些行*.proto文件名,我曾嘗試:

[INPUT] | sed 's/^.*\([a-zA-Z0-9_]+\.proto\).*$/\1/' 

我知道我的問題的一部分是.*是貪婪的,我要得到的東西像e.protoo.proto2.proto,但我甚至不能走到這一步......它只是與輸出與th相同e輸入。任何幫助將不勝感激。

+0

感謝大家的答案!沒想到一次有這麼多的幫助......我希望我能全部接受他們 – AndyPerlitch

回答

2

我發現使用擴展正則表達式可以達到這個目的(-r),在這種情況下,您不必越過括號。

sed -r 's/^.*[^a-zA-Z0-9_]([a-zA-Z0-9_]+\.proto).*$/\1/' 

添加的[^a-zA-Z0-9_]迫使.*不貪心。

1

一個辦法做到這一點:

sed 's/^.*[^a-zA-Z0-9_]\([a-zA-Z0-9_]\+\.proto\).*$/\1/' 
  • 躲過了+焦炭
  • 放了否定的alphanum之前+下劃線來分隔領先的字符

另一種方法:使用單報價劃分,畢竟它是在這裏:

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\)'.*\$/\1/" 
1

使用此sed

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\).*$/\1/" 

+ - 擴展的正則表達式。所以,你需要逃避以獲得特別的意義。 The preceding item will be matched one or more times.

另一種方式:

sed "s/^.*'\([^']\+\.proto\)'.*$/\1/" 
2

既然你標記您的命令,我假設你有GNU的grep。挑選的

grep -oP '\w+\.proto' file 
grep -o "[^']+\\.proto" file 
1

隨着GNU一個sed的:

sed -E "s/.*'([^']+)'$/\1/"