2016-06-27 2 views
2

У меня есть следующая строка /path/to/my-jar-1.0.jar, для которой я пытаюсь написать rehx bash, чтобы вытащить my-jar.Группа захвата из regex в bash

Теперь я считаю, что следующее регулярное выражение будет работать: ([^\/]*?)-\d, но я не знаю, как получить bash для его запуска.

Следующая: echo '/path/to/my-jar-1.0.jar' | grep -Po '([^\/]*?)-\d' захватывает my-jar-1

ответ

4

В BASH вы можете сделать:

s='/path/to/my-jar-1.0.jar' 

[[ $s =~ .*/([^/[:digit:]]+)-[[:digit:]] ]] && echo "${BASH_REMATCH[1]}" 

my-jar 

Здесь "${BASH_REMATCH[1]}" напечатает захватили группу # 1, которая является выражением внутри первого (...).

0

grep -o не распознает группы захвата. Думаю, всего лишь матч. Тем не менее, с регулярными выражениями Perl (-P) у вас есть возможность «опережения», чтобы исключить -\d от матча:

echo '/path/to/my-jar-1.0.jar' | grep -Po '[^/]*(?=-\d)' 

Некоторые справочные материалы на просмотр вперед/просмотра назад: http://www.perlmonks.org/?node_id=518444

2

Вы можете сделать это а с префиксом оболочки и удаления суффиксов:

$ path=/path/to/my-jar-1.0.jar 
# Remove the longest prefix ending with a slash 
$ base="${path##*/}" 
# Remove the longest suffix starting with a dash followed by a digit 
$ base="${base%%-[0-9]*}" 
$ echo "$base" 
my-jar 

Хотя это немного раздражает, чтобы сделать преобразование в два этапа, он имеет преимущество только с помощью Posix Функции персонального res, поэтому он будет работать с любой совместимой оболочкой.

Примечание: порядок важен, поскольку базовое имя не может содержать косой черты, но компонент пути может содержать тире. Поэтому сначала нужно удалить компоненты пути.

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