Получить подстроку, используя Perl или Sed - PullRequest
2 голосов
/ 20 марта 2019

Я не могу правильно получить подстроку.

declare BRANCH_NAME="bugfix/US3280841-something-duh";

# Trim it down to "US3280841"
TRIMMED=$(echo $BRANCH_NAME | sed -e 's/\(^.*\)\/[a-z0-9]\|[A-Z0-9]\+/\1/g')

Это все еще возвращает bugfix/US3280841-something-duh.

Если я попытаюсь использовать вместо этого Perl:

declare BRANCH_NAME="bugfix/US3280841-something-duh";

# Trim it down to "US3280841"
TRIMMED=$(echo $BRANCH_NAME | perl -nle 'm/^.*\/([a-z0-9]|[A-Z0-9])+/; print $1');

Это ничего не выводит.

Чтоя делаю не так?

Ответы [ 7 ]

6 голосов
/ 20 марта 2019

Использование только расширения параметров bash:

$: # don't use caps; see below.
$: declare branch="bugfix/US3280841-something-duh"
$: tmp="${branch##*/}"
$: echo "$tmp"
US3280841-something-duh
$: trimmed="${tmp%%-*}" 
$: echo "$trimmed"
US3280841

Что означает:

$: tmp="${branch_name##*/}"
$: trimmed="${tmp%%-*}" 

выполняет работу в два этапа без запуска дополнительных процессов.

В sed,

$: sed -E 's#^.*/([^/-]+)-.*$#\1#' <<< "$branch"

Это говорит: «после любого или без символов, за которыми следует косая черта, запомните один или несколько символов, которые не являются косыми чертами или тире, затем следует незапоминаемая тире, а затем любые или никакие символы, затемзамените весь ввод запомненной частью. "

Ваш исходный шаблон был

's/\(^.*\)\/[a-z0-9]\|[A-Z0-9]\+/\1/g'

Это говорит: «запомните любое число, за которым следует косая черта, затем строчная буква или цифра, затем символ канала (потому что они работают только с-E), затем заглавная буква или цифра, затем буквальный знак плюс, а затем замените все это на то, что вы запомнили. "

Руководство по GNU - ваш друг.Я все время выгляжу, чтобы убедиться, что все делаю правильно.Иногда это все еще занимает у меня несколько попыток, смеется.

В сторону - постарайтесь не использовать имена переменных с прописными буквами.Это соглашение, которое указывает, что оно особенное для ОС, например, RANDOM или IFS.

1 голос
/ 20 марта 2019

Perl версия просто имеет + в неправильном месте.Он должен быть внутри скобок захвата:

TRIMMED=$(echo $BRANCH_NAME | perl -nle 'm/^.*\/([a-z0-9A-Z]+)/; print $1');
1 голос
/ 20 марта 2019
sed 's:[^/]*/\([^-]*\)-.*:\1:'<<<"bugfix/US3280841-something-duh"
1 голос
/ 20 марта 2019

Вы можете использовать это sed:

sed -E 's~^.*/|-.*$~~g' <<< "$BRANCH_NAME"

US3280841

От этого awk:

awk -F '[/-]' '{print $2}' <<< "$BRANCH_NAME"

US3280841
0 голосов
/ 27 апреля 2019

Другой вариант с использованием Классы символов регулярного выражения Perl (см. perldoc perlrecharclass).

echo $BRANCH_NAME | perl -nE 'say m/^.*\/([[:alnum:]]+)/;'
0 голосов
/ 08 апреля 2019

тип на терминале оболочки

$ BRANCH_NAME="bugfix/US3280841-something-duh"

$ echo $BRANCH_NAME| perl -pe 's/.*\/(\w\w[0-9]+).+/\1/'

используйте команду s (заменить) вместо m (match)
perl - это расширенный набор sed, поэтому он будет идентичным 'sed -E' вместо'perl -pe'

0 голосов
/ 20 марта 2019

Просто используйте ^ перед A-Z0-9

TRIMMED=$(echo $BRANCH_NAME | sed -e 's/\(^.*\)\/[a-z0-9]\|[^A-Z0-9]\+/\1/g')

в вашем sed случае.

В качестве альтернативы и кратко вы можете использовать

TRIMMED=$(echo $BRANCH_NAME | sed "s/[a-z\/\-]//g" )

тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...