С grep
вы можете использовать
var1="$(grep -o '\${[^{}]*}' file1.txt | head -1)"
. | head -1
используется для извлечения первого матча, если их больше.
См. онлайн-демонстрацию:
f='select * from ${database_name}.tab_name;'
var1="$(grep -o '\${[^{}]*}' <<< "$f" | head -1)"
echo "$var1"
С sed
вы можете использовать
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' file"
См. онлайн-демонстрацию :
f='select * from ${database_name}.tab_name;'
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' <<< $f)"
echo "$var1"
# => ${database_name}
Сведения о регулярном выражении
.*
- соответствует 0+ символов (\$\{[^{}]*})
- захватывает в группу 1 (\1
) и следует $
символс {
, 0+ символами, отличными от {
и }
, а затем }
.*
- соответствует 0+ символам.
В качестве заменыэто ссылка на текст группы 1, это все, что остается после того, как sed
выполнит свою работу.Обратите внимание на параметр -E
: он включает синтаксис POSIX ERE, где (...)
используется для указания группы захвата, а не \(...\)
.