Я попытался с помощью следующей команды sed удалить префикс и суффикс с символом _
. Тем не менее, он удален до последнего _. Кто-нибудь может помочь?
Input: abc_exa_mp_le_1.1
Пробовал следующий sed
x= bc_exa_mp_le_1.1
$ z = "$(sed -e 's/.*_\(.*\)\.*/\1/' <<<"$x")"
$ echo "$z"
1.1
Expected output:exa_mp_le
Кто-нибудь может помочь?
Вы можете использовать
z = "$(sed 's/^[^_]*_\(.*\)_.*/\1/' <<< $x)"
См. онлайн-демонстрация sed
.
Детали узора
^
- начало строки[^_]*
- 0+ символов кроме _
_
- подчеркивание\(.*\)
— группа 1 (\1
относится к этой части совпадающего текста): любые символы 0+_
- подчеркивание.*
- любые символы 0+ до конца строки.Возможно, 0+
должен читать zero or more
, а этот *
жадный и потребляет как можно больше совпадений, т.е. .*
соответствует всей строке.
Это также можно сделать в чистом bash:
x = "bc_exa_mp_le_1.1"
z = "${s%_*}"
z = "${s#*_}"
echo "$z"
exa_mp_le
Вы также можете использовать более простой sed
:
z=$(sed -E 's/^[^_]*_|_[^_]*$//g' <<< "$x")
Эта команда sed
сначала удаляет все до первого _
, а затем удаляет часть, начиная с последнего _
, во входной строке.
Используйте
z = "$(sed -e 's/^[^_]*_\(.*\)_.*/\1/' <<< "$x")"