Как получить подстроку из переменной BASH и поместить ее в другую переменную?
В переменной UDATA есть некий текст, мне нужно вырезать из нее подстроку между r=' и ' поместить в другую переменную. Совсем не могу понять как это сделать средствами bash. Прошу помощи.
echo $UDATA | sed "/(r=\')(\w+)(\')/p"
Этот код выводит все что есть в переменной не вырезая.
Ответы (3 шт):
Можно так NEW_VAR=$(echo "<text>" | grep -E -o "<regexp>"):
- Флаг
-Eдля regexp - Флаг
-oдля возврата только соответствия
Или можно так NEW_VAR=$(echo "<text>" | sed -E "s#(g1)(g2)(g3)#\2#g")
можно обойтись без запуска дополнительного процесса, т.е. средствами самого процесса posix-совместимой оболочки:
$ s="p='bla' r='bum' q='bom'"
$ s=${s#*r=\'}
$ s=${s%%\'*}
$ echo $s
bum
сначала удаляем префикс *r=\', затем удаляем наиболее длинный суффикс \'*
но, конечно, можно использовать и дополнительный процесс. например, программу sed:
$ s="p='bla' r='bum' q='bom'"
$ s=$(echo $s | sed "s/.*r='//;s/'.*//")
$ echo $s
bum
Если у вас одно совпадение в каждой/единственной строке, можно использовать GNU sed:
UDATA="text... r='Value' here."
sed -nE "s/.*r='([^']*).*/\1/p" <<< "$UDATA"
# => Value
См. пример. Подробности:
-nE- POSIX EREs/.*r='([^']*).*/\1/p: найти и заменить, а потом показать результат (/p):.*- 0 и более символовr='- подстрокаr='([^']*)- Подмаска 1: ноль и более символов, отличных от'..*- строка\1- заменить целое совпадение значением в первой подмаске
Если необходимо найти все совпадения, даже если в одной строке их несколько и есть возможность использовать GNU grep, используйте
UDATA="text... r='Value' here."
grep -oP "r='\K[^']*" <<< "$UDATA"
# => Value
См. пример.
-o- выводится не вся строка, а только найденное совпадениеP- используется библиотека PCREr='- буквальный текст\K- удаляет из буфера совпадения весь текст[^']*- ноль и более символов, отличных от'