Извлечь текст из строки и сохранить в переменной

Перейдите к системным настройкам и выберите значки (в разделе внешнего вида )и выберите любой значок.

0
22.04.2021, 19:45
4 ответа

Я попробовал grep, и он работал очень хорошо и довольно просто.

$(echo "feature/ABC-BranchName" | grep -Eo 'develop|release|((feature|bugfix|hotfix)/ABC-)([0-9]+)' |tr '/' '-');
0
24.05.2021, 09:37

Использованиеawk(в зависимости от того, насколько мало вариаций может иметь ваша входная строка):

awk -F[_/] '{print $3}' <<<"$string"

Если вы хотите иметь возможность обрабатывать более сложные структуры каталогов, вы можете сначала использовать базовое имя

basename "$string" | awk -F_ '{print $1}'

Для сохранения в переменной используйте подстановку команд

variable=$(awk -F[_/] '{print $3}' <<<"$string")
4
28.04.2021, 22:51
string=/feature/abc-1245_branch_name

different_variable=${string%%_*}
different_variable=${different_variable##*/}

printf '%s\n' "$different_variable"

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

  • ${variable%%pattern}удаляет самую длинную подстроку, соответствующую pattern, из конца из $variable.
  • ${variable##pattern}удаляет самую длинную подстроку, соответствующую pattern, из начала строки $variable.

Если вы знаете, что такое _branch_nameна самом деле,

string=/feature/abc-1245_branch_name

different_variable=$( basename "$string" '_branch_name' )

printf '%s\n' "$different_variable"

Это обрабатывает строку как путь (, даже если это может быть не фактический путь ), и использует basenameдля получения последнего компонента пути (, т. е. «имени файла» ). Утилита basenameтакже может удалить суффикс имени файла, поэтому мы используем ее для удаления известной строки _branch_name.

5
28.04.2021, 22:51

И так как ни один ответ еще не основан на sedи вы просили об этом;

$ string="/feature/abc-1245_branch_name"
$ sed -e 's/^.*\///; s/_.*$//' <<<"$string"
abc-1245

Использовать подстановку команд, поскольку @jesse _b предлагает поместить результат в переменную:

$ result=$(sed -e 's/^.*\///; s/_.*$//' <<<"$string")
$ echo $result
abc-1245

Однако, если ваша строка не становится намного более сложной для синтаксического анализа, а шаблоны синтаксического анализа/фильтрации меняются от строки к строке, я бы использовал чистое решение @kusalananda Bash. Он делает то же самое, что и я здесь с sed, т. е. жадное сопоставление с образцом, но в этом простом случае чистый Bash, вероятно, является «естественным» выбором.

0
28.04.2021, 22:51

Теги

Похожие вопросы