2013-05-31 2 views
1

Я хотел бы сопоставить несколько расширений файлов, проходящих через канал с использованием sed и regex.Sed regex не соответствует 'or or' внутренней группе

следующие работы:

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

Смежные вопросы