Sed正则表达式不匹配'或'或'内部组

时间:2013-05-31 19:05:58

标签: regex sed regex-group

我想使用sed和regex匹配通过管道传递的多个文件扩展名。

以下作品:

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

2 个答案:

答案 0 :(得分:5)

我使用的是Mac OSX 10.8.3,之前的回答对我不起作用,但确实如此:

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

注意:使用-E

  

将正则表达式解释为扩展(现代)正则表达式   而不是基本的正则表达式(BRE)。

这将启用OR函数|;其他版本似乎希望-r标志启用扩展正则表达式。 请注意,必须转发初始.,且不得追尾$

答案 1 :(得分:2)

尝试这样的事情:

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

或者如果您已经使用-r选项来使用扩展正则表达式来避免转义特殊字符。