Как извлечь подстроку из строки, хранящейся в переменной, на основе символа начала / остановки

#string #bash #shell #character

#строка #bash #оболочка #символ

Вопрос:

В первой строке я указываю значение 64 и F2DD65

Я хочу перехватить первую переменную, прочитав данные из строки в переменной, сначала с начала строки до : символа, и прочитать другую переменную после # символа и на 6 символов вперед. Возможно ли это?

Это строка:

 var="64: (242,221,101) #F2DD65 srgb(242,221,101)"
  

мой конечный результат будет сохранен в переменных:
var1="64"
var2="F2DD65"

Ответ №1:

 var1=${var%%:*}
var2=${var##*#}
var2=${var2%% *}
  

Ссылка: расширение параметра оболочки.

Ответ №2:

 sed -rn 's/(^.*)(:.*#)(.*)([[:space:]].*$)/1 - 3/p' <<< "64: (242,221,101) #F2DD65 srgb(242,221,101)"
  

С помощью sed разделите строку на разделы, используя регулярные выражения (-r). Подставьте строку для соответствующего раздела (первый, а затем третий разделены символом -.

  awk -F [:# ] '{ print $1" - "$5 }'  <<< "64: (242,221,101) #F2DD65 srgb(242,221,101)"
  

С помощью awk разделите строку на основе :, # и пробела в качестве разделителей. Выведите 1-е и 5-е поля с разделителями и символом — между ними.

Ответ №3:

С помощью регулярных выражений bash:

 var="64: (242,221,101) #F2DD65 srgb(242,221,101)"
re="^([^:] ): .* #([[:xdigit:]] )"
if [[ $var =~ $re ]]; then
    var1="${BASH_REMATCH[1]}"
    var2="${BASH_REMATCH[2]}"
else
    # String isn't the right format
    echo Fail
fi