2014-01-30 4 views
0

У меня есть регулярное выражение:Perl Regex не работает в скрипте Bash?

^(.+?)(\.[^.]+$|$) 

, который отделяет имя файла и расширение файла (если есть один) http://movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/

отлично работает в Perl

Say $ FILE =» .myfile.form.txt '

$ 1 является' .myfile.form»и

$ 2 «.txt», так как они должны быть

Я знаю Баш регулярных выражений и Perl регулярное выражение не то же самое, но я никогда не имел проблем с Bash не Повторное сопоставление до сих

Но когда я пытаюсь использовать в в Баш скрипт, как, скажем ...

FILE='.myfile.form.txt' 
[[ $FILE =~ ^(.+?)(\.[^.]+$|$) ]] 

$ {BASH_REMATCH [1]} будет просто имя файла целиком (.myfile.form.txt), и ничего в $ {BASH_REMATCH [ 2]}

Мне интересно, что здесь не так/происходит

Спасибо за любую помощь!

+6

Что заставляет вас думать, Баш и Perl принимают одни и те же регулярные выражения? Это разные программы с разными правилами. –

+1

В сценарии bash, если вы хотите совместить, вы можете использовать grep, с -P, для использования выражений Perl. (подробнее: $ grep --help) – Tamalero

+0

О, извините, я не уточнил. Я знаю, что они не то же самое, мне интересно, что я могу изменить, чтобы он работал так, как предполагалось в сценарии Bash. И я попробовал «grep -oP», но система, в которой я нуждаюсь, чтобы работать, не позволяет использовать флаг -P, установленный grep без него. Кроме того, ремаркетинг в grep не сохранит групповое соответствие. И даже с -o, имя файла будет напечатано как одна строка, а не разделено –

ответ

1

regex(7), на который ссылается regex(3), на который ссылается bash(1), не упоминает модификаторы жадности. Ваш шаблон не может быть реализован в bash regex.

Это не значит, что вы не можете достичь того, чего хотите.

[[ $FILE =~ ^(.+)(\.[^.]*)$ ]] || [[ $FILE =~ ^(.*)()$ ]] 
file="${BASH_REMATCH[1]}" 
ext="${BASH_REMATCH[2]}" 

Или что-то более простое, как

if [[ $FILE =~ ^(.+)(\.[^.]*)$ ]]; then 
    file="${BASH_REMATCH[1]}" 
    ext="${BASH_REMATCH[2]}" 
else 
    file="$FILE" 
    ext="" 
fi 
+0

Это отлично работает! Спасибо огромное! –

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