4

Речь идет о разработке Bash и написании переносимых сценариев Bash, использующих RegEx.

Используя Bash RegEx, на Mac я могу сделать это:

coconut-mac$ a='bananacoconutman'; [[ "$a" =~ banana(.*?)man ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

Ницца. Полезно во многих местах. Подобно.

Когда я пытаюсь сделать это, это терпит неудачу:

coconut-mac$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}

Точно такая же команда отлично работает на пингвине:

coconut-linux$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
  • Зачем?
  • Как это исправить, чтобы сделать скрипт переносимым?

РЕДАКТИРОВАТЬ: На Mac:

OS X version: 10.8.2
Bash version: 4.2.37(2)-release

на Ubuntu 12.04 LTS:

Linux kernel version: 3.2.0-29-generic-pae
Linux version: Ubuntu 12.04.1 LTS
Bash version: 4.2.24(1)-release

2 ответа2

4

На моем Mac info bash / =~ RET говорит:

Доступен дополнительный бинарный оператор =~', is available, with the same precedence as ==' и `!знак равно Когда это используется, строка справа от оператора считается расширенным регулярным выражением и соответствует соответствующим образом (как в regex3)).

man 3 regex говорит:

Оператор повторения (?', *', +', or bounds) cannot follow another repetition operator. A repetition operator cannot begin an expression or subexpression or follow ^ 'или `|'.

Я не вижу аналогичной документации в регулярном выражении GNU man 3 regex или info regex .

Если я удалю ? от вашего (.*?) и выполните следующее, это работает на обеих ОС:

$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
3

Это, вероятно, будет ответом:

По умолчанию bash на Darwin (10.8.1/2):

GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)

По умолчанию bash на, скажем, Ubuntu 12 LTS:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)

Сделать его портативным - значит уйти от новых причуд в bash и использовать такие вещи, как sed , awk , whatnot.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .