2013-05-31 49 views
1

我想匹配通過使用sed和正則表達式通過管道傳遞的多個文件擴展名。Sed正則表達式不匹配'要麼'或內部組

以下工作:

sed '/.\(rb\)\$/!d' 

但是,如果我想允許多個文件擴展名,下面確實沒有工作

sed '/.\(rb\|js\)\$/!d' 
sed '/.\(rb|js\)\$/!d' 
sed '/.(rb|js)\$/!d' 

關於如何做/或內部組的任何想法?

這裏是整個代碼塊:

#!/bin/sh 
files=`git diff-index --check --cached $against | # Find all changed files 
     sed '/.\(rb\|js\)\$/!d'     | # Only process .rb and .js files 
     uniq`          # Remove duplicate files 
+0

爲什麼使用'\ $'而不是'$'? –

回答

5

我使用的是Mac OSX 10.8.3及以前的答案對我來說是不行的,但是這並不:

sed -E '/\.(rb|js)$/!d' 

注:使用-E

解釋的正則表達式擴展(現代)正則表達式 而不是基本正則表達式(BRE)。

並且這啓用了或功能|;其他版本似乎希望-r標誌啓用擴展正則表達式。 請注意,初始.必須轉義並且尾隨$一定不能。

+0

感謝您的徹底解答 – alaup

2

嘗試是這樣的:

sed '/\.\(rb\|js\)$/!d' 

,或者如果你已經再使用-r選項可以使用擴展的正則表達式,以避免轉義特殊字符。

+1

有[sed的一個很好的概述和教程](http://www.grymoire.com/Unix/Sed.html#uh-30)和一個[相應的正則表達式相同](http:// www .grymoire.com/Unix的/ Regular.html)。 – thunk

+0

很好的建議。工作 - 使用-E而不是-r。 – alaup