2016-03-24 4 views
0

У меня есть сценарий оболочки Unix, и я хочу получить подстроку между _ и -, но NOT - и _.Как получить подстроку между двумя символами, где порядок символов?

Пример:

cs-ui-21140322175352_8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87-2.x86_64 

Я хочу извлечь:

8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87 

И хранить его в переменной.

ответ

2

У вас может быть больше недочетов и других вещей, чем ваш образец ввода. Для вашего ввода образца вы можете сделать что-то вроде

newvar=$(echo "${inputstr}" | sed -e 's/[^_]*_//' -e 's/-.*//') 
# or 
newvar=$(echo "${inputstr}" | sed -e 's/.*_\(.*\)-.*/\1/') 
# or 
newvar=$(echo "${inputstr}" | cut -d "_" -f2 | cut -d "-" -f1) 
+0

Я получил 64 на первом. Вторая работала нормально. Последний дал мне ошибку: cut: [-cf] list: незаконное значение списка cut: [-cf] list: значения могут не включать нуль – Nelson

+0

Извините, исправлено. Первый был жадным '. *', Просто нужно сказать, чтобы есть все, кроме _. Ограничитель разреза - опция d, а не c. –

1
inputstr=cs-ui-21140322175352_8ddjdb1b4cc4a87d17034dd3704q5a0ea60d6d87-2.x86_64 

newvar=`echo $inputstr | sed 's,.*_\(.*\)-.*,\1,'` 
+0

Это похоже на мое второе решение. Обратите внимание, что '$ (cmd)' является более безопасным и легким, чем backtics. –

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