2013-05-31 48 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